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

B.5.7 BLOB型データの更新

BLOB型データの更新を行うサンプルコードについて説明します。

本サンプルコードは、FileStreamオブジェクトを使用してファイルより取得したBLOB型データを、挿入または更新します。

アプリケーションの手順

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

  2. OdbcDataAdapterオブジェクトを生成します。(SelectCommandプロパティへ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. FileStreamオブジェクトを使用してBLOB型データをファイルよりバイト配列へ取得します。

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

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

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

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

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

エラー処理については、“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 fs As System.IO.FileStream
        Dim MyData() As Byte
        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.IMGTBL", con)
            '3. DataSetオブジェクトの生成
            dst = New DataSet()
            '4. DataSet オブジェクトへデータを取得
            adp.Fill(dst, "IMGTBL")
            '5. OdbcDataAdapter.InsertCommandプロパティの設定
            adp.InsertCommand = New System.Data.Odbc.OdbcCommand(
"INSERT INTO IMGTBL 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("BLB_C", System.Data.Odbc.OdbcType.VarBinary)
            adp.InsertCommand.Parameters("BLB_C").SourceColumn = "BLB_C"

            '7. OdbcDataAdapter.UpdateCommandプロパティの設定
            adp.UpdateCommand = New System.Data.Odbc.OdbcCommand(
    "UPDATE IMGTBL SET KEY_C=?, BLB_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("BLB_C", System.Data.Odbc.OdbcType.VarBinary)
            adp.UpdateCommand.Parameters("BLB_C").SourceColumn = "BLB_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. BLOB型データをファイルより取得する
            fs = New System.IO.FileStream _
     ("C:\yamasaki\test.bmp", System.IO.FileMode.OpenOrCreate,
      System.IO.FileAccess.Read)
            ReDim MyData(fs.Length)
            fs.Read(MyData, 0, fs.Length)
            fs.Close()
            fs = Nothing

            '10.データの更新(DataSetに1行もデータがない場合は行を追加する)
            If Not dst.Tables("IMGTBL").Rows.Count = 0 Then
                myRow = dst.Tables("IMGTBL").Rows(0)
            Else
                myRow = dst.Tables("IMGTBL").NewRow
            End If

            myRow.BeginEdit()
            myRow("KEY_C") = 1
            myRow("BLB_C") = MyData
            myRow.EndEdit()

            If dst.Tables("IMGTBL").Rows.Count = 0 Then
                dst.Tables("IMGTBL").Rows.Add(myRow)
            End If

            '11. INSERT文/UPDATE文の実行
            adp.Update(dst, "IMGTBL")
            '12. DataSet オブジェクトに対して行われたすべての編集をコミットする
            dst.AcceptChanges()

            MessageBox.Show("データベースにBLOB型データが保存されました",
                     "Normal End", MessageBoxButtons.OK, MessageBoxIcon.None)

            '13. コネクション切断
            con.Close()

            '14. オブジェクトの破棄
            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