How To資料: 匿名のPL/SQLブロックを介したデータベース表に対するBLOBデータの読込み/書込み

目的

このHow To資料を完了すると、次のことができるようになります。

  • ODP.NETを使用した匿名のPL/SQLブロックの実行

  • ファイルからデータベースへのイメージ・データの保存

  • データベースからファイルへのイメージ・データの書込み

前提条件

読者がMicrosoft Visual Studio.NETについての知識を持ち、また、ODP.NETやデータベースの基本を理解していることを前提とします。

概要

このドキュメントでは、匿名のPL/SQLブロックを使用して、ファイル内のBLOB(Binary Large OBject)データをデータベース表に挿入し、そのデータをデータベースから取り出して、ファイルに書き込む方法を示します。匿名のPL/SQLブロックとは、PL/SQL文の名前を持たないブロックです。このブロックは、データベース内にオブジェクトとして格納されず、1回実行された後削除されます。匿名のPL/SQLブロックを使用すると、1回のラウンドトリップで一連のSQLコールを一括処理できるため、パフォーマンスが向上します。

このHow To資料では、画像ファイルからのBLOBデータをデータベース表に挿入し、その画像を取り出して、ローカル・ファイル・システム上の他のファイルに書き込む匿名のPL/SQLブロックを作成します。この場合、ソースの画像ファイルと宛先の画像ファイルの場所を指定する必要があります。OracleDbType.Blob型のパラメータは、匿名のPL/SQLブロックにバインドされます。注意: この手順説明のテストには、.jpgや.gifなどの画像ファイルを使用してもかまいません。ただし、この手順説明では画像ファイルは使用していません。

要件

  • Oracle Data Provider for .NET (ODP.NET)

  • SQL*Net TCP/IPリスナーを運用しているOracle R8.0.6 以降 (各プラットフォーム)

  • Microsoft Visual Studio .NET(Microsoft .NET Framework 1.0以上など)でインストールされるC#またはVisual Basic .NET(VB.NET)

データベース・オブジェクトの作成

このHow To資料では、TestBlob表を使用します。SQL*Plusを使用して、任意のユーザー(scott/tigerなど)としてデータベースに接続し、リスト1に示されている次のコマンドを実行して、必要なデータベース・オブジェクトを作成します。

リスト1
DROP TABLE TestBlob;

CREATE TABLE TestBlob (id number, photo BLOB);

コードの説明

必要な名前空間のインクルード: スクリプト内で名前空間の使用方法が限定されないようにするために、.csまたは.vbファイルの「general declarations」セクションに名前空間の参照を追加することをお薦めします。

C#
using System;
using System.Data;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using System.IO;
using System.Text;
Visual Basic .NET
Imports System
Imports System.Data
Imports Oracle.DataAccess.Client
Imports Oracle.DataAccess.Types
Imports System.IO
Imports System.Text

1. ODP.NETを使用して、Oracleデータベースへの接続を確立します。

C#

//Step 1
// Connect to database
// Note: Modify User Id, Password, Data Source as per your database setup
string constr = "User Id=Scott;Password=tiger;Data Source=orcl9i";
OracleConnection con = new OracleConnection(constr);
con.Open();
Console.WriteLine("Connected to database!");
Visual Basic .NET
'Step 1
' Connect to database
' Note: Modify User Id, Password, Data Source as per your database setup
Dim constr As String = "User Id=Scott;Password=tiger;Data Source=orcl9i"
Dim con As OracleConnection = New OracleConnection(constr)
con.Open()
Console.WriteLine("Connected to database!")

2.ソースの場所から画像ファイルを読み込み、バイト配列に入れます。

C#
// Step 2
// Note: Modify the Source and Destination location
// of the image as per your machine settings
String SourceLoc  = "D:/Images/photo.jpg";
String DestinationLoc = "D:/Images/TestImage.jpg";

// provide read access to the file
FileStream fs = new FileStream(SourceLoc, FileMode.Open,FileAccess.Read);

// Create a byte array of file stream length
byte[] ImageData = new byte[fs.Length];

//Read block of bytes from stream into the byte array
fs.Read(ImageData,0,System.Convert.ToInt32(fs.Length));

//Close the File Stream
fs.Close();
Visual Basic .NET
' Step 2
' Note: Modify the Source and Destination location
' of the image as per your machine settings
Dim SourceLoc As String = "D:/Images/photo.jpg"
Dim DestinationLoc As String = "D:/Images/TestImage.jpg"

' provide read access to the file
Dim Fs As FileStream = New FileStream(SourceLoc,
                       FileMode.Open, FileAccess.Read)

' Create a byte array of file stream length
Dim ImageData As Byte()
ReDim imagedata(fs.Length)

'Read block of bytes from stream into the byte array
fs.Read(ImageData, 0, System.Convert.ToInt32(fs.Length))

'Close the File Stream
fs.Close()

3. OracleCommandオブジェクトを使用して、匿名のPL/SQLブロックを作成します。

C#
 // Step 3
// Create Anonymous PL/SQL block string
String block = " BEGIN " +
	           " INSERT INTO testblob (id, photo) VALUES (100, :1); " +
	           " SELECT photo into :2 from testblob WHERE id = 100; " +
	           " END; ";
        					
// Set command to create Anonymous PL/SQL Block
OracleCommand cmd = new OracleCommand();
cmd.CommandText = block;
cmd.Connection = con;
								
// Since executing an anonymous PL/SQL block, setting the command type
// as Text instead of StoredProcedure
cmd.CommandType = CommandType.Text;
Visual Basic .NET
' Step 3
' Create Anonymous PL/SQL block string
Dim block As String =
   " BEGIN " & _
   " INSERT INTO testblob (id, photo) VALUES (100, :1) ;" & _
   " SELECT photo into :2 from testblob WHERE id = 100 ;" & _
   " end ;"

' Set command to create Anonymous PL/SQL Block
Dim cmd As OracleCommand = New OracleCommand()
cmd.CommandText = block
cmd.Connection = con

' Since executing an anonymous PL/SQL block, setting the command type
' as Text instead of StoredProcedure
cmd.CommandType = CommandType.Text

4. 画像データを含むバイト配列をOracleCommandオブジェクトにバインドします。

C#
// Step 4
// Setting Oracle parameters

// Bind the parameter as OracleDbType.Blob to command for inserting image
OracleParameter param = cmd.Parameters.Add("blobtodb", OracleDbType.Blob);
param.Direction = ParameterDirection.Input;

// Assign Byte Array to Oracle Parameter
param.Value = ImageData;

// Bind the parameter as OracleDbType.Blob to command for retrieving the image
OracleParameter param2 = cmd.Parameters.Add("blobfromdb", OracleDbType.Blob);
param2.Direction = ParameterDirection.Output;
Visual Basic .NET
' Step 4
' Setting Oracle parameters

' Bind the parameter as OracleDbType.Blob
' to command for inserting image
Dim param As OracleParameter = cmd.Parameters.Add("blobtodb", OracleDbType.Blob)
param.Direction = ParameterDirection.Input

' Assign Byte Array to Oracle Parameter
param.Value = ImageData

' Bind the parameter as OracleDbType.Blob
' to command for retrieving the image
Dim param2 As OracleParameter = cmd.Parameters.Add("blobfromdb", OracleDbType.Blob)
param2.Direction = ParameterDirection.Output

5. OracleCommandオブジェクトを使用して、匿名ブロックを実行します。

C#

// Step 5
// Execute the Anonymous PL/SQL Block

// The anonymous PL/SQL block inserts the image to the
// database and then retrieves the images as an output parameter
cmd.ExecuteNonQuery();
Console.WriteLine("Image file inserted to database from " + SourceLoc);
Visual Basic .NET
' Step 5
' Execute the Anonymous PL/SQL Block
' The anonymous PL/SQL block inserts the image to the database and then retrieves
' the images as an output parameter
cmd.ExecuteNonQuery()
Console.WriteLine("Image file inserted to database from "+ SourceLoc)

6. データベースから取り出したOracleBlobオブジェクトを、指定された宛先の場所に保存します。

C#

// Step 6
// Save the retrieved image to the DestinationLoc in the file system
// Create a byte array
byte[] byteData = new byte[0];

// fetch the value of Oracle parameter into the byte array
byteData = (byte[])((OracleBlob)(cmd.Parameters[1].Value)).Value;

// get the length of the byte array
int ArraySize = new int();
ArraySize = byteData.GetUpperBound(0);

// Write the Blob data fetched from database to the filesystem at the
// destination location
FileStream fs1 = new FileStream(@DestinationLoc,
                                FileMode.OpenOrCreate, FileAccess.Write);
fs1.Write(byteData, 0,ArraySize);
fs1.Close();

Console.WriteLine("Image saved to " + DestinationLoc + " successfully !");
Console.WriteLine("");
Console.WriteLine("***********************************************************");
Console.WriteLine("Before running this application again, execute 'Listing 1' ");
Console.WriteLine("given in 'Create Database Objects' section in the How-to.");
Console.WriteLine("***********************************************************");
Visual Basic .NET
' Step 6
' Save the retrieved image to the DestinationLoc in the file system
' Create a byte array
Dim byteData As Byte()
Dim Paramvalue As OracleBlob
Paramvalue = cmd.Parameters(1).Value

' fetch the value of Oracle parameter into the byte array
byteData = CType((Paramvalue.Value), Byte())

' get the length of the byte array
Dim ArraySize As Integer = New Integer()
ArraySize = byteData.GetUpperBound(0)

' Write the Blob data fetched from database to the filesystem at
' the destination location
Dim fs1 As FileStream = New FileStream(DestinationLoc, 
                                       FileMode.OpenOrCreate, FileAccess.Write)
fs1.Write(byteData, 0, ArraySize)
fs1.Close()

Console.WriteLine("Image saved to " + DestinationLoc + " successfully !")
Console.WriteLine("")
Console.WriteLine("***********************************************************")
Console.WriteLine("Before running this application again, execute 'Listing 1' "
Console.WriteLine("given in 'Create Database Objects' section in the How-to.")
Console.WriteLine("***********************************************************") 

手順説明のセットアップおよび実行

1. Visual Studio.NETをオープンします。

2. コンソール・アプリケーション・プロジェクトを作成します。

C#
C#で、コンソール・アプリケーション・プロジェクトを作成します。デフォルトで、Class1.csがプロジェクトに追加されます。
Visual Basic .NET
VB.NETでコンソール・アプリケーション・プロジェクトを作成します。デフォルトで、Module1.vbがプロジェクトに追加されます。

3. プロジェクトに、System, Oracle.DataAccessおよびSystem.Data名前空間への参照が含まれていることを確認します。存在しない場合は、これらの名前空間への参照を追加します。

4. コードをコピーします。

C#

Solution Explorerを使用して、Class1.csをオープンします。C#によるこの手順説明書のコードの完全なリストについては、ここをクリックしてください。このコードをコピーし、Class1.csの内容を上書きします。

Visual Basic .NET

Solution Explorerを使用して、Module1.vbをオープンします。VB.NETによるこの手順説明書のコードの完全なリストについては、ここをクリックしてください。このコードをコピーし、Module1.vbの内容を上書きします。

5. コードの手順1にあるご使用のデータベースのセットアップに従って、ユーザーID、パスワード、データ・ソースを変更します。

6. コードの手順2にあるご使用のマシンの設定に従って、 SourceLoc, DestinationLoc変数を変更します。

7. このアプリケーションをコンパイルし実行するために、[Ctrl]+[F5]を押します。図1.1に示されている出力が表示されます。


図1.1 出力のスクリーンショット

8. このアプリケーションを再度実行する前に、「データベース・オブジェクトの作成」の項にあるリスト1を実行します。


リソース


ODP.NETについては、OTN掲示板の、プログラミングの部屋で取り扱います。

  ※当ページはOracle Technology Network(US)サイトに掲載されたページの翻訳です。原文を見る
Copyright © 2003, Oracle Corporation. All rights reserved. Contact UsLegal Notices and Terms of UsePrivacy Statement
This page is managed and cached by Oracle9i