- PR -

DataSetの内容をDBに書き込む

投稿者投稿内容
未熟者
常連さん
会議室デビュー日: 2006/08/12
投稿数: 20
投稿日時: 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("保存完了しました。")
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-08-15 21:47
引用:

未記入さんの書き込み (2006-08-15 21:45) より:
ds.AcceptChanges()


これを省いてみては?
確か、DataSetが覚えてる今まであった変更を全て
忘れてしまうようなメソッドだったと思うのですが
未熟者
常連さん
会議室デビュー日: 2006/08/12
投稿数: 20
投稿日時: 2006-08-15 21:52
返答ありがとうございます。はじめは ds.AcceptChanges() は記述していなかったのですが、記述していないと
'System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました。
とエラーメッセージがUpdate文のところで発生します、あとAcceptChangesは前回のFillからの変更点をコミットするものだと記憶してましたが違うんでしょうか?それとも使用方法がまちがってるのかな。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-08-16 06:24
引用:

未熟者さんの書き込み (2006-08-15 21:52) より:
返答ありがとうございます。はじめは ds.AcceptChanges() は記述していなかったのですが、記述していないと
'System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました。
とエラーメッセージがUpdate文のところで発生します、あとAcceptChangesは前回のFillからの変更点をコミットするものだと記憶してましたが違うんでしょうか?


AccetpChangesを実行するとDataTableのレコードの変更履歴がリセットされますので
DataAdapterのUpdateメソッドでDataTableがデータベースに反映されません。

つまり、DataTableをなにも変更していない状態になります。

AccetpChangesを削除してUpdateメソッドで
「'System.Data.OleDb.OleDbException' 」のエラーが発生する原因を調べてください。

たとえば、データベースの書き込み権限がないとか?何のデータベースをお使いですか?


_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
未熟者
常連さん
会議室デビュー日: 2006/08/12
投稿数: 20
投稿日時: 2006-08-16 13:14
返信ありがとうございます、DBはAccess2003を使用しています、書き込み権限やNULLの許容などの部分はしっかりやっていますし、Accessの方で実際に手入力でレコードを入れてみたりもしましたができました。
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 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に設定する必要があります。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2006-08-16 13:27
引用:

vincentさんの書き込み (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に設定する必要があります。



NAL-6295です。

その必要はありません。
http://msdn2.microsoft.com/ja-JP/library/system.data.oledb.oledbcommandbuilder.aspx

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2006-08-16 13:27 ]
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-08-16 14:06
どうやら全開で間違えた模様。
DataAdapterを引数に取っているので、プロパティへの設定は不要ですね。
すいません…。

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