DataSetオブジェクトを使用して更新を行うサンプルコードについて説明します。
OdbcCommandBuilderオブジェクトを使用した自動生成コマンドは使用できません。明示的にコマンドを設定してください。
本サンプルコードは、UPDATE文実行後、影響を受けた行数をメッセージボックスで表示します。
アプリケーションの手順
OdbcConnectionオブジェクトでコネクションを接続します。詳細は、“C.5.1 接続および切断”を参照してください。
OdbcDataAdapterオブジェクトを生成します。(SelectCommandTextプロパティへSELECT文を設定します)
DataSetオブジェクトを生成します。
OdbcDataAdapter.FillメソッドでデータをDataSetへ取得します。
OdbcDataAdapter.InsertCommandプロパティへINSERT文を設定します。
InsertCommandプロパティへ設定したパラメタに対応するOdbcParameterオブジェクトの生成と設定をします。
OdbcDataAdapter.InsertCommand.Parameters.AddメソッドでOdbcParameterオブジェクトを生成します。SQL文中のパラメタマーカ('?')の出現順に生成してください。
OdbcParameter.ParameterNameプロパティには、オブジェクト名を任意で設定します。
OdbcParameter.OdbcTypeプロパティを設定します。
OdbcParameter.SourceColumnプロパティへパラメタの値(Valueプロパティ)に使用するDataSetの列名を設定します。
OdbcDataAdapter.UpdateCommandプロパティへUPDATE文を設定します。
UpdateCommandプロパティへ設定したパラメタに対応するOdbcParameterオブジェクトの生成と設定をします。
OdbcDataAdapter.UpdateCommand.Parameters.AddメソッドでOdbcParameterオブジェクトを生成します。SQL文中のパラメタマーカ('?')の出現順に生成してください。
OdbcParameter.ParameterNameプロパティには、オブジェクト名を任意で設定します。
OdbcParameter.OdbcTypeプロパティを設定します。
OdbcParameter.SourceColumnプロパティへパラメタの値(Valueプロパティ)に使用するDataSetの列名を設定します。
探索条件(WHERE句)に設定するOdbcParameter.SourceVersionプロパティにDataRowVersion.Originalを設定します。
データの編集をします。
OdbcDataAdapter.Tables.Rows.Countメソッドを使用してDataSetに取り出した行数を取得します。
行がある場合は1行目を更新対象行としてDataRowオブジェクトへ取り出します。
行がない場合はDataSet.Tables.NewRowメソッドで新しい行を作成しDataRowオブジェクトへ取り出します。
DataRow.BeginEditメソッドで編集モードにしてデータの編集をします
DataRow.EndEditメソッドで編集を終了します。
NewRowメソッドにより作成したDataRowオブジェクトをDataSet.Tables.Rows.Addメソッドで追加します。
OdbcDataAdapter.UpdateメソッドでDataSetの編集操作の内容により設定したINSERT文かUPDATE文を実行します。
DataSet.AcceptChangesメソッドでDataSetに対して行った編集内容をコミットします。
コネクションを切断します。
オブジェクトを破棄します。
エラー処理については、“C.5.10 エラー処理”を参照してください。
'オブジェクト宣言
Dim con As Microsoft.Data.Odbc.OdbcConnection
Dim adp As Microsoft.Data.Odbc.OdbcDataAdapter
Dim dst As DataSet
Dim myRow As DataRow
'OdbcConnectionオブジェクトの生成
con = New Microsoft.Data.Odbc.OdbcConnection("DSN=DSN01;UID=USER01;PWD=PASS01;")
Try
'1. コネクション接続
con.Open()
'2. OdbcDataAdapterオブジェクトの生成
adp = New Microsoft.Data.Odbc.OdbcDataAdapter("SELECT * FROM TESTTBL", con)
'3. DataSetオブジェクトの生成
dst = New DataSet()
'4. DataSet オブジェクトへデータを取得
adp.Fill(dst, "TESTTBL")
'5. OdbcDataAdapter.InsertCommandプロパティの設定
adp.InsertCommand = New Microsoft.Data.Odbc.OdbcCommand( _
"INSERT INTO TESTTBL VALUES(?,?,?,?)", con)
'6. OdbcParameterオブジェクトの生成と設定
adp.InsertCommand.Parameters.Add("KEY_C", Microsoft.Data.Odbc.OdbcType.Int)
adp.InsertCommand.Parameters("KEY_C").SourceColumn = "KEY_C"
adp.InsertCommand.Parameters.Add("DEC_C", Microsoft.Data.Odbc.OdbcType.Decimal)
adp.InsertCommand.Parameters("DEC_C").SourceColumn = "DEC_C"
adp.InsertCommand.Parameters.Add("DAT_C", Microsoft.Data.Odbc.OdbcType.Date)
adp.InsertCommand.Parameters("DAT_C").SourceColumn = "DAT_C"
adp.InsertCommand.Parameters.Add("CHA_C", Microsoft.Data.Odbc.OdbcType.Char)
adp.InsertCommand.Parameters("CHA_C").SourceColumn = "CHA_C"
'7. OdbcDataAdapter.UpdateCommandプロパティの設定
adp.UpdateCommand = New Microsoft.Data.Odbc.OdbcCommand( _
"UPDATE TESTTBL SET KEY_C=?, DEC_C=?, DAT_C=?, CHA_C=? WHERE KEY_C=?", con)
'8. OdbcParameterオブジェクトの生成と設定
adp.UpdateCommand.Parameters.Add("KEY_C", Microsoft.Data.Odbc.OdbcType.Int)
adp.UpdateCommand.Parameters("KEY_C").SourceColumn = "KEY_C"
adp.UpdateCommand.Parameters.Add("DEC_C", Microsoft.Data.Odbc.OdbcType.Decimal)
adp.UpdateCommand.Parameters("DEC_C").SourceColumn = "DEC_C"
adp.UpdateCommand.Parameters.Add("DAT_C", Microsoft.Data.Odbc.OdbcType.Date)
adp.UpdateCommand.Parameters("DAT_C").SourceColumn = "DAT_C"
adp.UpdateCommand.Parameters.Add("CHA_C", Microsoft.Data.Odbc.OdbcType.Char)
adp.UpdateCommand.Parameters("CHA_C").SourceColumn = "CHA_C"
adp.UpdateCommand.Parameters.Add("KEY", Microsoft.Data.Odbc.OdbcType.Int)
adp.UpdateCommand.Parameters("KEY").SourceColumn = "KEY_C"
adp.UpdateCommand.Parameters("KEY").SourceVersion = DataRowVersion.Original
'9. データの更新(DataSetに1行もデータがない場合は行を追加する)
If Not dst.Tables("TESTTBL").Rows.Count = 0 Then
myRow = dst.Tables("TESTTBL").Rows(0)
Else
myRow = dst.Tables("TESTTBL").NewRow
End If
myRow.BeginEdit()
myRow("KEY_C") = 400
myRow("DEC_C") = 9999999.999
myRow("DAT_C") = 2007/04/10"
myRow("CHA_C") = "TEST DATA"
myRow.EndEdit()
If dst.Tables("TESTTBL").Rows.Count = 0 Then
dst.Tables("TESTTBL").Rows.Add(myRow)
End If
'10. INSERT文/UPDATE文の実行
adp.Update(dst, "TESTTBL")
'11.DataSet オブジェクトに対して行われたすべての編集をコミットする
dst.AcceptChanges()
MessageBox.Show("データベースにデータが保存されました", _
"Normal End", MessageBoxButtons.OK, MessageBoxIcon.None)
'12.コネクション切断
con.Close()
'13.オブジェクトの破棄
con.Dispose()
dst.Dispose()
adp.Dispose()
'エラー処理
Catch ex As Microsoft.Data.Odbc.OdbcException
'エラー処理ルーチンを記述
End Try