- - PR -
DataSetの内容をDBに書き込む
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-08-15 21:45
現在DataSet内のテーブルに新規レコードを追加するまではウォッチリストで確認できているのですが、その内容をUpdateするとプログラムは無事終了するのですがDBに反映されていません、ご教授お願いします。
コネクションはすでに開いている Public da As New Data.OleDb.OleDbDataAdapter Public cmd As New OleDb.OleDbCommand Public CB As Data.OleDb.OleDbCommandBuilder Public ds As New DataSet Public R As DataRow cmd.CommandText = "select * from 業務マスタ" da.SelectCommand = cmd da.Fill(ds, "業務マスタ") ds.Tables("業務マスタ").PrimaryKey = New DataColumn() {ds.Tables("業務マスタ").Columns("業務ID")} R = ds.Tables("業務マスタ").NewRow R("業務ID") = Microsoft.VisualBasic.Left(cmbBiluID.Text, 3) & "-" & Microsoft.VisualBasic.Left(cmbGyouID.Text, 3) & "-" & Microsoft.VisualBasic.Left(cmbSagyoID.Text, 4) R("ビルID") = Microsoft.VisualBasic.Left(cmbBiluID.Text, 3) R("業者ID") = Microsoft.VisualBasic.Left(cmbGyouID.Text, 3) R("作業ID") = Microsoft.VisualBasic.Left(cmbSagyoID.Text, 3) ds.Tables("業務マスタ").Rows.Add(R) ds.AcceptChanges() CB = New Data.OleDb.OleDbCommandBuilder(da) da.Update(ds, "業務マスタ") MsgBox("保存完了しました。") | ||||
|
投稿日時: 2006-08-15 21:47
これを省いてみては? 確か、DataSetが覚えてる今まであった変更を全て 忘れてしまうようなメソッドだったと思うのですが | ||||
|
投稿日時: 2006-08-15 21:52
返答ありがとうございます。はじめは ds.AcceptChanges() は記述していなかったのですが、記述していないと
'System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました。 とエラーメッセージがUpdate文のところで発生します、あとAcceptChangesは前回のFillからの変更点をコミットするものだと記憶してましたが違うんでしょうか?それとも使用方法がまちがってるのかな。 | ||||
|
投稿日時: 2006-08-16 06:24
AccetpChangesを実行するとDataTableのレコードの変更履歴がリセットされますので DataAdapterのUpdateメソッドでDataTableがデータベースに反映されません。 つまり、DataTableをなにも変更していない状態になります。 AccetpChangesを削除してUpdateメソッドで 「'System.Data.OleDb.OleDbException' 」のエラーが発生する原因を調べてください。 たとえば、データベースの書き込み権限がないとか?何のデータベースをお使いですか? _________________ ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集 | ||||
|
投稿日時: 2006-08-16 13:14
返信ありがとうございます、DBはAccess2003を使用しています、書き込み権限やNULLの許容などの部分はしっかりやっていますし、Accessの方で実際に手入力でレコードを入れてみたりもしましたができました。
| ||||
|
投稿日時: 2006-08-16 13:22
コードを見た感じだと、DataAdapterにUpdateCommandが設定されていませんね。
CommandBuilderは生成するだけじゃダメで、 CB = New Data.OleDb.OleDbCommandBuilder(da) の次に da.InsertCommand = CB.GetInsertCommand() da.UpdateCommand = CB.GetUpdateCommand() da.DeleteCommand = CB.GetDeleteCommand() などとやって更新系コマンドをDataAdapterに設定する必要があります。 | ||||
|
投稿日時: 2006-08-16 13:27
NAL-6295です。 その必要はありません。 http://msdn2.microsoft.com/ja-JP/library/system.data.oledb.oledbcommandbuilder.aspx [ メッセージ編集済み 編集者: NAL-6295 編集日時 2006-08-16 13:27 ] | ||||
|
投稿日時: 2006-08-16 14:06
どうやら全開で間違えた模様。
DataAdapterを引数に取っているので、プロパティへの設定は不要ですね。 すいません…。 |