連載
» 2006年03月07日 00時00分 公開

VB.NETで楽々Oracleストアド・プロシージャ作成.NETでOracleアプリを作ろう(5)(2/4 ページ)

[小海友和,日本オラクル]

LOBデータのロード/アンロード

 GetEname関数は、データベースにアクセスする非常にシンプルな関数ですが、単にデータベースにアクセスするだけの関数であれば、Oracleデータベース固有のトランザクション処理言語であるPL/SQLによる実装でも簡単にVS.NETから作成することができますし高速です。

 次は少し実践的に、OracleデータベースにLOB(Large Object)データ(画像ファイルなどのバイナリファイル)を格納したり、取り出したりするサンプルを作成してみましょう。日ごろ慣れ親しんだ、.NET準拠言語でOSファイルの読み取り・書き出しの実装が可能ですので、比較的簡単にLOBデータを扱うプロシージャを実装することができます。

手順1 LOBデータを格納する表を作成

 まず、データベースでLOBデータを格納するためのテーブル(BLOB_TBL)を作成します。新規テーブルの作成は、VS.NETのOracleエクスプローラ上の「表」を右クリックし、「新規リレーショナル表」をクリックして行います。BLOB_TBLの構造を表1に示します。

図3 OracleエクスプローラからBLOB_TBLの作成 図3 OracleエクスプローラからBLOB_TBLの作成
列名 データ型 目的
NAME VARCHAR2 格納するLOBデータ名の格納用
IMAGE BLOB バイナリのLOBデータ格納用
表1 BLOB_TBLの構造

 表名や列の設定が終わったら、「保存」ボタンをクリックします。

手順2 LOBデータをロードするプロシージャの作成

 まず、LOBデータをデータベースに格納するためのプロシージャとして、Load_LOBプロシージャを作成します。このプロシージャは、格納するLOBデータのパスを渡すことで、そのファイルをデータベースに格納するものになります。LOBデータのパスからファイル名を取得し、BLOB_TBLのNAME列に格納し、ファイルをIMAGE列に格納するプロシージャです。

 新しいプロジェクトをOracle Projectとして作成し、リスト4のコードを記述します。

Imports System.IO
(中略)
Public Shared Sub Load_LOB(ByVal source_path As String)

    ' ファイル名の取得
    Dim filename = Path.GetFileName(source_path)

    ' ファイル読み込みのためにFileStreamを作成
    Dim fs As FileStream = _
      New FileStream(source_path, FileMode.Open, FileAccess.Read)
    ' バイト配列の作成
    Dim ImageData(fs.Length) As Byte
    'FileStreamでByte配列にブロックを読み込む
    fs.Read(ImageData, 0, System.Convert.ToInt32(fs.Length))
    'FileStreamのクローズ
    fs.Close()

    ' データベースへの接続の準備
    Dim conn As New OracleConnection("context connection=true")

    ' 実行するSQL文の準備
    Dim sqlStr As String = _
    "INSERT INTO blob_tbl (name, image) VALUES (:1, :2)"

    ' OracleCommandの準備
    Dim cmd As New OracleCommand(sqlStr, conn)

    ' OracleParameterの準備 for :1
    Dim param1 As OracleParameter = _
      cmd.Parameters.Add(":1", OracleDbType.Varchar2)
    param1.Direction = ParameterDirection.Input
    param1.Value = filename

    ' OracleParameterの準備 for :2
    Dim param2 As OracleParameter = _
      cmd.Parameters.Add(":2", OracleDbType.Blob)
    param2.Direction = ParameterDirection.Input
    param2.Value = ImageData

    ' データベースへの接続
    conn.Open()
    ' コマンドの実行
    cmd.ExecuteNonQuery()
    ' 接続を閉じる
    conn.Close()

End Sub
リスト4 Load_LOBプロシージャ(VB.NET)

 今回はファイルの入出力を行いますので、クラスファイルの先頭に「Imports System.IO」と記述しておきます。ソースの前半(「データベースへの接続の準備」の前まで)は、純粋にVB.NETの世界です。パスからファイル名を取り出し、FileStreamを使用して、ファイルをByte配列として読み込みます。

 「データベースへの接続の準備」からは、一般的なODP.NETの記述になります。バインド変数を持つINSERT文をOracleCommandとして用意し、OracleParameterを通じて、ファイル名やLOBデータをバインドし、実行します。

 BLOB列へのデータの挿入は、PL/SQLパッケージとして用意されている「dbms_lob」を使用したPL/SQLブロックで行うこともできますが、.NETストアド・プロシージャの方がシンプルで一般的な記述で作成可能です。(次ページへ続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。