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

B.4.3 BLOB型データの参照

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

本サンプルコードは、GetChunkメソッドで16384バイトずつBLOB型データを取得します。取得したBLOB型データはFileStreamオブジェクトを使用してファイルに出力します。出力したデータをピクチャボックスコントロールで表示します。事前にフォームへピクチャボックスコントロール(PictureBox1)を追加してください。

アプリケーションの手順

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

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

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

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

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

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

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

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

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

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

        Dim MyImage As Bitmap
        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
        Dim i 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)

        '行カウントの初期化
        i = 1

        '4. データの取得
        'EOFまで繰り返し
        Do Until Rst.EOF

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

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

                'イメージオブジェクトの破棄
                If Not (MyImage Is Nothing) Then
                    MyImage.Dispose()
                    MyImage = Nothing
                    PictureBox1.Image = Nothing
                End If

                '規定量にデータを分けて取得するため、分割数と残量を求める
                Chunks = Fl \ ChunkSize
                Fragment = Fl Mod ChunkSize

                '残量分のデータ取得
                ReDim Chunk(Fragment - 1)
                Chunk = Rst.Fields("BLB_C").GetChunk(Fragment)

                'FileStreamオブジェクトの生成(ファイルを開く)
                fs = New System.IO.FileStream _
         ("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
                'Bitmapオブジェクトの生成
                MyImage = New Bitmap("C.BMP")
                '出力したファイルをPictureBoxコントロールで表示する
                PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
                PictureBox1.Image = CType(MyImage, Image)
                PictureBox1.ImageLocation = "C.BMP"
                PictureBox1.Refresh()
            End If
            'メッセージボックスの表示
            MessageBox.Show(i & "行目を取得しました",
              "Message", MessageBoxButtons.OK, MessageBoxIcon.None)
            '行の位置づけ
            Rst.MoveNext()
            i += 1
        Loop

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

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

        '7. オブジェクトの破棄
        Rst = Nothing
        Con = Nothing
        'イメージオブジェクトの破棄
        If Not (MyImage Is Nothing) Then
            MyImage.Dispose()
            MyImage = Nothing
            PictureBox1.Image = Nothing
        End If


        Exit Sub

        'エラー処理
ErrorProc:

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

    End Sub
End Class