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

D.2.3 BLOB型データの参照

BLOB型データを参照するサンプルコードについて説明します。

本サンプルコードは、1行目のBLOB型データをGetChunkメソッドで16384バイトずつ取得します。取得したBLOB型データは、FileStreamオブジェクトを使用してファイルに出力します。出力したデータをイメージコントロールで表示します。事前にフォームへイメージコントロール“Image1”を追加してください。なお、本サンプルで表示する、BLOB型データは予めVisual Basicなどを利用して登録してください。

アプリケーションの手順

  1. コネクションを接続します。詳細は、“D.2.1 接続および切断”を参照してください。

  2. Recordsetオブジェクトを生成します。

  3. Recordset.OpenメソッドでRecordsetオブジェクトを開きます。

  4. Recordsetオブジェクトよりデータを取得します。
    Recordset.BOFプロパティでカレント行がBOFかを確認します。
    Recordset.EOFプロパティでカレント行がEOFかを確認します。
    Field.ActualSizeプロパティで取得データのバイト数を確認します。
    Field.GetChunkメソッドで指定バイト数分データを取得します。

  5. Recordset.CloseメソッドでRecordsetオブジェクトを閉じます。

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

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

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

'オブジェクト宣言
Dim Con As ADODB.Connection
Dim Rst As ADODB.Recordset

Dim fs As System.IO.FileStream
Dim Chunks As Short
Dim Fl As Integer
Dim Fragment As Short
Dim Chunk() As Byte
Const ChunkSize As Short = 16384
Dim k As Integer

'Connectionオブジェクトの生成と設定
Con = New ADODB.Connection
Con.ConnectionString = "DSN=DSN01;UID=USER01;PWD=PASS01;"

On Error GoTo ErrorProc

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

'2. Recordsetオブジェクトの生成
Rst = New ADODB.Recordset

'3. Recordsetオブジェクトを開く
Rst.Open("SELECT * FROM IMGTBL", Con, _
         ADODB.CursorTypeEnum.adOpenForwardOnly, _
         ADODB.LockTypeEnum.adLockReadOnly, _
         ADODB.CommandTypeEnum.adCmdText)

'4. データの取得
'結果列が存在するか
If Not (Rst.BOF And Rst.EOF) Then

    'BLOB型データのサイズを取得
    Fl = Rst.Fields("BLB_C").ActualSize

    'BLB_C列にデータがあるか
    If Fl > 0 Then
        'BLOB型データが存在する場合

        '規定量にデータを分けて取得するため、分割数と残量を求める
        Chunks = Fl \ ChunkSize
        Fragment = Fl Mod ChunkSize
        '残量分のデータ取得
        ReDim Chunk(Fragment - 1)
        Chunk = Rst.Fields("BLB_C").GetChunk(Fragment)
        'FileStreamオブジェクトの生成(ファイルを開く)
        fs = New System.IO.FileStream _
         (Server.MapPath("C.BMP"), System.IO.FileMode.OpenOrCreate, _
          System.IO.FileAccess.Write)

        'BLOB型データをファイルに出力する
        fs.Write(Chunk, 0, Fragment)

        ReDim Chunk(ChunkSize - 1)
        '分割数分繰り返し
        For k = 1 To Chunks
            '規定量分のデータ取得
            Chunk = Rst.Fields("BLB_C").GetChunk(ChunkSize)
            'BLOB型データをファイルに出力する
            fs.Write(Chunk, 0, ChunkSize)
        Next k

        'FileStreamオブジェクトを閉じて破棄する
        fs.Close()
        fs = Nothing

        '出力したファイルをImageコントロールで表示する
        Image1.ImageUrl = "C.BMP"

    End If

End If

'5. Recordsetオブジェクトを閉じる
Rst.Close()

'6. コネクション切断
Con.Close()

'7. オブジェクトの破棄
Rst = Nothing
Con = Nothing

Exit Sub

'エラー処理
ErrorProc:

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