ページの先頭行へ戻る
Symfoware Server V10.0.0/V10.0.1 アプリケーション開発ガイド(ODBCドライバ編)

C.5.7 BLOB型データの更新

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

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

アプリケーションの手順

  1. OdbcConnectionオブジェクトでコネクションを接続します。詳細は、“C.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. オブジェクトを破棄します。

エラー処理については、“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

Dim fs As System.IO.FileStream
Dim MyData() As Byte

'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 IMGTBL", con)
    '3. DataSetオブジェクトの生成
    dst = New DataSet()
    '4. DataSet オブジェクトへデータを取得
    adp.Fill(dst, "IMGTBL")
    '5. OdbcDataAdapter.InsertCommandプロパティの設定
    adp.InsertCommand = New Microsoft.Data.Odbc.OdbcCommand( _
    "INSERT INTO IMGTBL 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("BLB_C",Microsoft.Data.Odbc.OdbcType.VarBinary)
    adp.InsertCommand.Parameters("BLB_C").SourceColumn = "BLB_C"

    '7. OdbcDataAdapter.UpdateCommandプロパティの設定
    adp.UpdateCommand = New Microsoft.Data.Odbc.OdbcCommand( _
    "UPDATE IMGTBL SET KEY_C=?, BLB_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("BLB_C", Microsoft.Data.Odbc.OdbcType.VarBinary)
    adp.UpdateCommand.Parameters("BLB_C").SourceColumn = "BLB_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. BLOB型データをファイルより取得する
    fs = New System.IO.FileStream _
     ("C.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 Microsoft.Data.Odbc.OdbcException

    'エラー処理ルーチンを記述

End Try