ページの先頭行へ戻る
Symfoware Server V12.7.0 アプリケーション開発ガイド(ODBCドライバ編)
FUJITSU Software

B.5.6 データのメモリ内キャッシュを使用した更新

DataSetオブジェクトを使用して更新を行うサンプルコードについて説明します。

OdbcCommandBuilderオブジェクトを使用した自動生成コマンドは使用できません。明示的にコマンドを設定してください。

本サンプルコードは、UPDATE文実行後、影響を受けた行数をメッセージボックスで表示します。

アプリケーションの手順

  1. OdbcConnectionオブジェクトでコネクションを接続します。詳細は、“B.5.1 接続および切断”を参照してください。

  2. OdbcDataAdapterオブジェクトを生成します。(SelectCommandTextプロパティへSELECT文を設定します)

  3. DataSetオブジェクトを生成します。

  4. OdbcDataAdapter.FillメソッドでデータをDataSetへ取得します。

  5. OdbcDataAdapter.InsertCommandプロパティへINSERT文を設定します。

  6. InsertCommandプロパティへ設定したパラメタに対応するOdbcParameterオブジェクトの生成と設定をします。
    OdbcDataAdapter.InsertCommand.Parameters.AddメソッドでOdbcParameterオブジェクトを生成します。SQL文中のパラメタマーカ('?')の出現順に生成してください。
    OdbcParameter.ParameterNameプロパティには、オブジェクト名を任意で設定します。
    OdbcParameter.OdbcTypeプロパティを設定します。
    OdbcParameter.SourceColumnプロパティへパラメタの値(Valueプロパティ)に使用するDataSetの列名を設定します。

  7. OdbcDataAdapter.UpdateCommandプロパティへUPDATE文を設定します。

  8. UpdateCommandプロパティへ設定したパラメタに対応するOdbcParameterオブジェクトの生成と設定をします。
    OdbcDataAdapter.UpdateCommand.Parameters.AddメソッドでOdbcParameterオブジェクトを生成します。SQL文中のパラメタマーカ('?')の出現順に生成してください。
    OdbcParameter.ParameterNameプロパティには、オブジェクト名を任意で設定します。
    OdbcParameter.OdbcTypeプロパティを設定します。
    OdbcParameter.SourceColumnプロパティへパラメタの値(Valueプロパティ)に使用するDataSetの列名を設定します。
    探索条件(WHERE句)に設定するOdbcParameter.SourceVersionプロパティにDataRowVersion.Originalを設定します。

  9. データの編集をします。
    OdbcDataAdapter.Tables.Rows.Countメソッドを使用してDataSetに取り出した行数を取得します。
    行がある場合は1行目を更新対象行としてDataRowオブジェクトへ取り出します。
    行がない場合はDataSet.Tables.NewRowメソッドで新しい行を作成しDataRowオブジェクトへ取り出します。
    DataRow.BeginEditメソッドで編集モードにしてデータの編集をします
    DataRow.EndEditメソッドで編集を終了します。
    NewRowメソッドにより作成したDataRowオブジェクトをDataSet.Tables.Rows.Addメソッドで追加します。

  10. OdbcDataAdapter.UpdateメソッドでDataSetの編集操作の内容により設定したINSERT文かUPDATE文を実行します。

  11. DataSet.AcceptChangesメソッドでDataSetに対して行った編集内容をコミットします。

  12. コネクションを切断します。

  13. オブジェクトを破棄します。

エラー処理については、“B.5.10 エラー処理”を参照してください。

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        'オブジェクト宣言
        Dim con As System.Data.Odbc.OdbcConnection
        Dim adp As System.Data.Odbc.OdbcDataAdapter
        Dim dst As DataSet
        Dim myRow As DataRow
        Dim msgstr As String


        'OdbcConnectionオブジェクトの生成
        con = New System.Data.Odbc.OdbcConnection("DSN=DSN01;UID=USER01;PWD=PASS01;")

        Try
            '1. コネクション接続
            con.Open()

            '2. OdbcDataAdapterオブジェクトの生成
            adp = New System.Data.Odbc.OdbcDataAdapter("SELECT * FROM SAMPLE1.TESTTBL", con)
            '3. DataSetオブジェクトの生成
            dst = New DataSet()
            '4. DataSet オブジェクトへデータを取得
            adp.Fill(dst, "TESTTBL")
        
            '5. OdbcDataAdapter.InsertCommandプロパティの設定
            adp.InsertCommand = New System.Data.Odbc.OdbcCommand( _
             "INSERT INTO TESTTBL VALUES(?,?,?,?)", con)
            '6. OdbcParameterオブジェクトの生成と設定
            adp.InsertCommand.Parameters.Add("KEY_C", System.Data.Odbc.OdbcType.Int)
            adp.InsertCommand.Parameters("KEY_C").SourceColumn = "KEY_C"
            adp.InsertCommand.Parameters.Add("DEC_C", System.Data.Odbc.OdbcType.Decimal)
            adp.InsertCommand.Parameters("DEC_C").SourceColumn = "DEC_C"
            adp.InsertCommand.Parameters.Add("DAT_C", System.Data.Odbc.OdbcType.Date)
            adp.InsertCommand.Parameters("DAT_C").SourceColumn = "DAT_C"
            adp.InsertCommand.Parameters.Add("CHA_C", System.Data.Odbc.OdbcType.Char)
            adp.InsertCommand.Parameters("CHA_C").SourceColumn = "CHA_C"
        
            '7. OdbcDataAdapter.UpdateCommandプロパティの設定
            adp.UpdateCommand = New System.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", System.Data.Odbc.OdbcType.Int)
            adp.UpdateCommand.Parameters("KEY_C").SourceColumn = "KEY_C"
            adp.UpdateCommand.Parameters.Add("DEC_C", System.Data.Odbc.OdbcType.Decimal)
            adp.UpdateCommand.Parameters("DEC_C").SourceColumn = "DEC_C"
            adp.UpdateCommand.Parameters.Add("DAT_C", System.Data.Odbc.OdbcType.Date)
            adp.UpdateCommand.Parameters("DAT_C").SourceColumn = "DAT_C"
            adp.UpdateCommand.Parameters.Add("CHA_C", System.Data.Odbc.OdbcType.Char)
            adp.UpdateCommand.Parameters("CHA_C").SourceColumn = "CHA_C"
            adp.UpdateCommand.Parameters.Add("KEY", System.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") = "2018/08/03"
            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 System.Data.Odbc.OdbcException

            'エラー処理ルーチンを記述
            msgstr = "▲▼  COMMUNICATION OFF LINE  ▲▼"
            MessageBox.Show(msgstr, "!ERROR!", MessageBoxButtons.OK,
                                   MessageBoxIcon.None)

        End Try

    End Sub
End Class