- PR -

テキストボックスの内容でテーブル更新ができない?

1
投稿者投稿内容
未記入
会議室デビュー日: 2004/12/22
投稿数: 4
投稿日時: 2004-12-22 01:06
はじめて投稿します。初心者ゆえ、ご教授お願いします。
部品在庫管理アプリを構築中ですが、下記のプログラムでは各テキストボックス(1)〜(4)の入力内容でテーブルが更新されないのです。
以下、ソースの抜粋です。

Dim con as OleDb.OleDbConnection
Dim da As OleDb.OleDbDataAdapter
Dim ds As DataSet
Dim dr As DataRow
Dim dc(1) As DataColumn
Dim cmd As New OleDb.OleDbCommandBuilder(da)
Dim strNo as String ・・・編集したい部品No(ユーザー入力)です


'// データベースに接続し、データセットにテーブルを作成します
con = ・・・Accessデータベースへの接続処理です
da = New OleDb.OleDbDataAdapter("SELECT * FROM 部品マスタ", con)
ds = New DataSet("部品マスタ")
da.Fill(ds, "部品マスタ")
con.Close()

'// 部品Noを主キーに設定して編集行を検索します
dc(0) = ds.Tables("完成品マスタ").Columns("部品No")
ds.Tables("部品マスタ").PrimaryKey = dc
dr = ds.Tables("部品マスタ").Rows.Find(strNo)

'// 検索行の内容を編集します
dr.BeginEdit()
dr("部品No") = TextBox1.Text ・・・(1)
dr("部品名") = TextBox2.Text ・・・(2)
dr("単価") = TextBox3.Text  ・・・(3)
dr("在庫数量") = TextBox4.Text・・・(4)
dr.EndEdit()

'// データベースを更新して部品一覧に戻ります
da.UpdateCommand = cmd.GetUpdateCommand
da.Update(ds, "部品マスタ")



試しにテキストボックスの内容ではなく、固定文字列にするとうまくテーブルに反映されます。例えば上記(1)のところを、

    dr("部品No") = "001"
とか、
    Dim strTemp as String = "001"
    dr("部品No") = strTemp 
 
などとするとOKなのです。あと、同じフォームを使ってInsertCommandを設定した「新規追加」の処理では、テキストボックスの内容が反映されて新規行がきちんと追加されます。

テキストボックスに入力された内容でレコードを更新するというのは、どんな参考書にも載っている基本だと思うのですが、それさえままならず困っています。アドバイスをどうぞよろしくお願いします。
 
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2004-12-22 07:32
書き込まれないって、エラーになるの?それとも何事も無かったかのように動くけど、書き込まれないの?

取り合えず気になった点をいくつか。
(1)でプライマリキーを書き換える必要は無いよね。
(1)でTextBox1.Textに格納されているのは、一字一句違わずに"001"になっている?
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2004-12-22 07:32
おはようございます。
さかもとと申します。
同じく初心者なのでご期待に添えないかもしれませんが・・・。

1:Insertはうまくいくとのことですが,Updateの時TextBox1〜4.Textには
値が正確に入っていますか?

2:或いは更新時の時エラーが発生するなどはありますか?
 
3:Insertでうまくいくという場合,主キーを既存のものにセットしてもうまくいくでしょうか?

ご確認下さい。


未記入
会議室デビュー日: 2004/12/22
投稿数: 4
投稿日時: 2004-12-22 08:26
甕星様 さかもと様

おはようございます。早速のお返事ありがとうございます。ご質問の件お答えします。

Update時にエラーなどは特に発生せず、「何事も無かったかのように」更新されず動いています。

Insert・Updateのいずれも、テキストボックスには正確に値を入力しています。甕星様のおっしゃるとおり、UpdateCommandを適用する「修正更新」時には主キーを入力する必要が無いので、実際にはTextBox1はReadOnlyとしています。

Insert時に既存の主キーで入力すると重複のエラーとなりますので、これは例外処理を加えています。

お手数をおかけしますが、引き続きどうぞよろしくお願いします。

さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2004-12-22 08:49
さかもとです。
TextBox1に値を「入力」しているのかではなく
コード上でブレークポイントを入れて,TextBox1〜4.Textに値が正確に
「セット」されているかを確認してください。
甕星様がおっしゃるように
>(1)でTextBox1.Textに格納されているのは、一字一句違わずに"001"になっている?
を確認願います。
"001" が "1" になっていたり,null になっているのかな,と思いまして。

未記入
会議室デビュー日: 2004/12/22
投稿数: 4
投稿日時: 2004-12-22 09:24
さかもと様

ありがとうございます。
さっそくUpdateRowの各列にテキストボックスの内容が反映された(であろう)所にブレークポイントを入れて実行してみました。
すると、ブレークした時点で、各テキストボックスの.Textが変更されていないことに気がつきました。つまり、たとえばもともとTextBox2.Textが"部品001"だったところを"部品001-1"と修正しても、ブレーク時点でTextBox2.Textは"部品001"のままなのです。たしかにこれではデータセットへの反映もデータベースへの更新もできないですね。

ただ、どうして再入力したテキストボックスの内容が.Textへセットされないのか謎です。
(InsertCommandのプロシージャも同じような箇所でブレークしてみましたが、こちらはブレーク時点で入力内容が.Textに反映されています)

よろしくお願いします。
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2004-12-22 09:48
さかもとです。

画面の動作順序などが不明なのでどのタイミングで値がセットされているのか
分かりませんが

dr("部品No") = TextBox1.Text ・・・(1)
dr("部品名") = TextBox2.Text ・・・(2)

のところで直接 TextBox1.Text をセットせずに

一旦
Dim strBuhinNo as String = TextBox1.Text


としておいて

dr("部品No") =strBuhinNo

としたらどうなるでしょうか?

未記入
会議室デビュー日: 2004/12/22
投稿数: 4
投稿日時: 2004-12-22 10:19
さかもと様

ありがとうございます。どうやら解決できたようなので、経緯をご報告します。

ブレークポイントでテキストボックス入力値が.Textに反映されていないことが不思議だったので、テキストボックスのAutoPostBackプロパティをTrueにしてみたところ、テキストボックスに再入力してフォーカスを抜けた瞬間にテキストボックスの内容が元に戻ってしまうことに気付きました。
もしや?と思い、Page_Loadプロシージャの初期処理(最初にテキストボックスにデータセットから値をセットするところ)をIf Not IsPostBack thenとEnd Ifで囲んでみたところ、正常に更新されるようになりました。

最初にPage_Loadプロシージャも掲載すればよかったんですね。「テキストボックスがおかしい」と視野が狭くなっていたもので・・・気がつけば恥ずかしいほど基本的なことでした。でも、ポストバックのことが少しだけ理解できたような気がします。

アドバイス、本当にありがとうございました。感謝いたします。

[ メッセージ編集済み 編集者: 未記入 編集日時 2004-12-22 10:23 ]
1

スキルアップ/キャリアアップ(JOB@IT)