この記事では、前回の記事『 .NETでデータベース・オブジェクトを使用する』の続編として、Visual Basic .NET(VB.NET)およびVisual C# .NET(C#)でラージ・オブジェクトを使用する方法について学習します。 とくに、.NETを使用してラージ・オブジェクト(LOB)を読み書きする方法を学習します。 さらに、BFILE(ファイルへのポインタ)を介してデータを読み出す方法についても説明します。 この記事で言及するスクリプトおよびファイルはすべて、 ここ で入手できます。 この記事を読むには、C#およびVB.NETのプログラミング全般についての知識が必要です。
この記事は、C#およびVB.NETのプログラミング全般について知識があり、LOBの基本的な知識も備えている開発者向けに書かれたものです。 LOBの概要については、 『Oracle Database アプリケーション開発者ガイド-ラージ・オブジェクト』または拙著 『Oracle Database 10g SQL』(McGraw-Hill/Osborne、2004年)を参照してください。
必要なソフトウェア
この記事で紹介するプログラム例を実際に試してみるには、次のソフトウェアがインストールされている必要があります。
- Windows NT 4.0、Windows 2000、Windows XP Professional、Windows Server 2003のいずれか
- アクセス可能なOracle Database
- Oracle Client(10.1.0.2.0以降)
- Oracle Net(10.1.0.2.0以降)
- Oracle Data Providers for .NET(場合によっては10.1.0.2.0以降が必要)
- Microsoft .NET Framework(1.0以降)
- Microsoft .NET Framework SDK(1.0以降)
注:Oracle Database 10gより前のリリース(Oracle8i release 3 8.1.7以降)を使用している場合は、データベースとは別にOracle Data Provider for .NET (ODP.NET)をダウンロードおよびインストールする必要があります。
ODP.NET ドライバは、Oracleデータベースにアクセスするとき最高のパフォーマンスが実現されるようにチューニングされています。また、Oracleデータベースの豊富な機能(BFILE、BLOB、CLOB、XMLTypeなど)もサポートしています。 Oracleデータベースを操作する.NETアプリケーションを開発する場合は、機能とパフォーマンスの両面で、ODP.NETが最善のデータ・アクセス・ソリューションです。
注: ODP.NET ドライバは、Oracleデータベースにアクセスするとき最高のパフォーマンスが実現されるようにチューニングされています。また、Oracleデータベースの豊富な機能(BFILE、BLOB、CLOB、XMLTypeなど)もサポートしています。 Oracleデータベースを操作する.NETアプリケーションを開発する場合は、ODP.NETが、機能とパフォーマンスの両面で、最善のデータ・アクセス・ソリューションとなります。
データベース・スキーマの設定
最初に、この記事で使用する表を含むデータベース・スキーマを設定する必要があります。 まず、lob_userという名前のユーザーを作成し、次のように必要な権限を付与します (ユーザーを作成し権限を付与するには、データベース管理者権限を持つユーザーとしてデータベースにログインする必要があります)。
CREATE USER lob_user IDENTIFIED BY lob_password;
GRANT CONNECT, RESOURCE, CREATE ANY DIRECTORY TO lob_user; 上記2つの文と、この節で紹介する、ストア・スキーマを設定するためのそのほかの文は、サンプル・コード・ファイルlob_db.sqlに含まれています。
次の文は、サーバーのハードディスク・ドライブ上のC:\sample_filesディレクトリを指す、SAMPLE_FILES_DIRという名前のディレクトリを作成します。ハードディスク・ドライブのC:パーティションにsample_filesディレクトリを作成し、textContent.txtとbinaryContent.docの各ファイルをC:\sample_filesにコピーしてください。
CREATE OR REPLACE DIRECTORY SAMPLE_FILES_DIR AS 'C:\sample_files'; 注: textContent.txtファイルとbinaryContent.docファイルには、シェークスピアの劇 『マクベス』からの引用テキストが含まれています。 このあとすぐ、これらのファイルの内容をデータベースにコピーします。
次の文は、publicに読取り権限を付与します。これにより、すべてのユーザーがSAMPLE_FILES_DIRの内容を読めるようになります。
GRANT READ ON DIRECTORY SAMPLE_FILES_DIR TO PUBLIC; 次の文でlob_userとして接続します。
CONNECT lob_user/lob_password; この記事では3つの表を使用します。
- clob_content: clob_columnという名前のCLOB列が定義されています。 この列には、textContent.txtファイルに含まれている文字データが格納されます。
- blob_content: blob_columnという名前のBLOB 列が定義されています。 この列には、binaryContent.docファイルに含まれているバイナリ・データが格納されます。
- bfile_content: bfile_columnという名前のBFILE列が定義されています。 この列には、2つの外部ファイルへのポインタが格納されます。
CREATE TABLE clob_content (
id INTEGER PRIMARY KEY,
clob_column CLOB NOT NULL
);
CREATE TABLE blob_content (
id INTEGER PRIMARY KEY,
blob_column BLOB NOT NULL
);
CREATE TABLE bfile_content (
id INTEGER PRIMARY KEY,
bfile_column BFILE NOT NULL
); これらの表をlob_userとは別のスキーマに作成する場合、後出のサンプル・プログラム内のスキーマ名を変更する必要があります。
次の2つの文は、clob_content表とblob_content表に、空のCLOBとBLOBを追加します。
INSERT INTO clob_content (
id, clob_column
) VALUES (
1, EMPTY_CLOB()
);
INSERT INTO blob_content (
id, blob_column
) VALUES (
1, EMPTY_BLOB()
); 次のPL/SQL文は、textContent.txtファイル内のテキストをclob_content表に、binaryContent.docファイル内のバイナリをblob_content表にロードします。
DECLARE
my_clob CLOB;
my_blob BLOB;
my_bfile BFILE;
BEGIN
-- load the CLOB
my_bfile := BFILENAME('SAMPLE_FILES_DIR', 'textContent.txt');
SELECT clob_column
INTO my_clob
FROM clob_content
WHERE id = 1 FOR UPDATE;
DBMS_LOB.FILEOPEN(my_bfile, dbms_lob.file_readonly);
DBMS_LOB.LOADFROMFILE(my_clob, my_bfile, DBMS_LOB.GETLENGTH(my_bfile), 1, 1);
-- load the BLOB
my_bfile := BFILENAME('SAMPLE_FILES_DIR', 'binaryContent.doc');
SELECT blob_column
INTO my_blob
FROM blob_content
WHERE id = 1 FOR UPDATE;
DBMS_LOB.FILEOPEN(my_bfile, dbms_lob.file_readonly);
DBMS_LOB.LOADFROMFILE(my_blob, my_bfile, DBMS_LOB.GETLENGTH(my_bfile), 1, 1);
DBMS_LOB.FILECLOSEALL();
COMMIT;
END;
/ 次の文は、bfile_content表内のBFILEが、SAMPLE_FILES_DIRディレクトリにあるtextContent.txtファイルを指すようにします。
INSERT INTO bfile_content (
id,
bfile_column
) VALUES (
1,
BFILENAME('SAMPLE_FILES_DIR', 'textContent.txt')
); C#およびVB.NETを使用してLOBからデータを読み出す
LOBを取り出す方法は2つあります。
- LOBロケータを使用したあとでLOBを取り出す: ODP.NETはデータベース・サーバー上のLOBへのポインタを取り出します。 実際のLOBデータは、アプリケーションがLOBの読み取りを開始するまで取り出されません。 CLOBの場合は、 Oracle.DataAccess.Types.OracleClobクラスのオブジェクトを使用してロケータを格納します。このロケータを OracleDataReaderオブジェクトの GetOracleClob()メソッドを使用して読み出し、次に Read()メソッドを使用して OracleClobに格納されているデータにアクセスします。 BLOBの場合は、 Oracle.DataAccess.Types.OracleBlobオブジェクトと GetOracleBlob()メソッドを使用します。
- すべて、または大部分のLOBデータを即座に取り出す: ODP.NETは、 SELECT文が実行されるとすぐ、すべてのLOBのLOBデータを取り出します。 CLOBの場合は、 OracleDataReaderの GetString()、 GetChars()、 GetValue()、 GetOracleString()のいずれかのメソッドを使用してデータを読み出します。 BLOBの場合は、 GetBytes()、 GetValue()、 GetValues()、 GetOracleBinary()のいずれかのメソッドを使用します。
SELECT文に指定されたすべてのLOBは、このパラメータの影響を受けます。 たとえば、 InitialLOBFetchSizeを5Kに設定し、 SELECT文の実行によって10個のLOBを取得する場合、10個のLOBそれぞれの最初の5Kが1回のラウンドトリップで取り出されます。 現在、ODP.NET 10.1.0.2.0で設定可能な InitialLOBFetchSizeの最大値は、32KBです。 オラクルでは、今後のリリースで、この最大値を2GBまで増やす予定です。
注: InitialLOBFetchSizeの値を0以外の値に変更した場合、CLOBの値を読み出すときに使用できるアクセッサは、上記のシナリオ2で述べたアクセッサに限定されます。この制限は今後のリリースで取り除かれる予定です。 ODP.NETの今後のリリースでは、LOBデータの取出しに、シナリオ1と2のどちらのメソッドでも使用できるようになります。
SELECTの対象となるすべてのLOBのデータ量は大きくないが、LOBの数が多い場合は、 InitialLOBFetchSizeの値をデフォルトの0以外に変更して、LOBデータを即座に取り出すようにすることで、パフォーマンスを向上させることができます。 InitialLOBFetchSizeを使用する場合は、SELECTの対象となるLOBの80%のサイズを若干超える値に設定してください。 たとえば、表内のLOBの80%が1KB以下の場合は、 InitialLOBFetchSizeを1KBに設定します。 InitialLOBFetchSizeを変更した効果は、ネットワーク性能、待機時間、データ・サイズなどによって異なるため、値を設定したら実際にLOBデータを取り出してみて最適な値を見つけてください。
InitialLOBFetchSizeの値をデフォルトの0から変更すると、LOBデータが即座に取り出されるようになります。 InitialLOBFetchSizeの値をデフォルト値の0のままにすると、LOBデータの取出しが遅延されます。LOBの取出しを遅延させたほうがよいのか、それとも即座におこなったほうがよいのかを決定する際に検討すべき原則を次の表にまとめておきます。
| LOBデータの取出しを遅延させるケース | LOBデータを即座に取り出すケース |
|---|---|
| クライアントとデータベース・サーバー間のネットワーク帯域幅が狭いとき | ネットワーク帯域幅が十分に確保されているとき |
| 大部分のLOBデータには即座にアクセスする必要がなく、時間をかけて取り出せばよいとき | すべてのLOBデータを、選択され次第、読み出す必要があるとき |
| 更新、挿入、削除操作を実行し、LOBを読み出さないとき | 該当なし |
LOBをあとで取り出す方法でLOBからデータを読み出す
次に、LOBロケータを使用して、clob_content.clob_columnに格納したテキスト、およびblob_content.blob_columnに格納したバイナリを読み出す4つのサンプル・プログラムの主要な処理手順を解説します。 次の4つのプログラムについて説明します。
- ClobExample1.cs:clob_content.clob_columnから読み出すC#プログラム
- ClobExample1.vb:ClobExample1.csと同じ内容のVB.NETプログラム
- BlobExample1.cs:blob_content.blob_columnから読み出すC#プログラム
- BlobExample1.vb:BlobExample1.csと同じ内容のVB.NETプログラム
手順1
ClobExample1.csの最初の手順では、clob_content表から行を読み出します。
myOracleCommand.CommandText =
"SELECT id, clob_column " +
"FROM clob_content " +
"WHERE id = 1";
OracleDataReader myOracleDataReader =
myOracleCommand.ExecuteReader();
myOracleDataReader.Read();
ClobExample1.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
myOracleCommand.CommandText = _
"SELECT id, clob_column " & _
"FROM clob_content " & _
"WHERE id = 1"
Dim myOracleDataReader As _
OracleDataReader = myOracleCommand.ExecuteReader()
myOracleDataReader.Read() BlobExample1.csの最初の手順では、blob_content表から行を読み出します。
myOracleCommand.CommandText =
"SELECT id, blob_column " +
"FROM blob_content " +
"WHERE id = 1";
OracleDataReader myOracleDataReader =
myOracleCommand.ExecuteReader();
myOracleDataReader.Read();
BlobExample1.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
myOracleCommand.CommandText = _
"SELECT id, blob_column " & _
"FROM blob_content " & _
"WHERE id = 1"
Dim myOracleDataReader As _
OracleDataReader = myOracleCommand.ExecuteReader()
myOracleDataReader.Read() 手順2
ClobExample1.csの手順2では、LOBロケータを OracleClobオブジェクトにコピーします。 ロケータを取得するには、 myOracleDataReader.GetOracleClob()メソッドを使用します。
OracleClob myOracleClob = myOracleDataReader.GetOracleClob(1); ClobExample1.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
Dim myOracleClob As _
OracleClob = myOracleDataReader.GetOracleClob(1) BlobExample1.csの手順2では、LOBロケータを OracleBlobオブジェクトにコピーします。 ロケータを取得するには、 myOracleDataReader.GetOracleBlob()メソッドを使用します。
OracleBlob myOracleBlob = myOracleDataReader.GetOracleBlob(1); BlobExample1.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
Dim myOracleBlob As _ OracleBlob = myOracleDataReader.GetOracleBlob(1) 手順3
ClobExample1.csの手順3では、 OracleClobオブジェクトの Read()メソッドを使用して、CLOBデータを取得します。 Read()メソッドには次の2つの呼出形式があります。
int Read(byte [] byteArray, int offset, int count)
int Read(char [] charArray, int offset, int count)- 戻り値の intは、読み出されたバイト数または文字数です。
- byteArrayと charArrayは、データを読み込む配列です。
- offsetは、配列内のデータ書き込み位置です。
- countは、読み出すバイト数または文字数です。
char [] charArray = new char[50];
int numCharsRead;
while ((numCharsRead = myOracleClob.Read(charArray, 0, 50)) > 0)
{
Console.WriteLine("numCharsRead = " + numCharsRead);
string clobData = new string(charArray, 0, numCharsRead);
Console.WriteLine("clobData = " + clobData);
} ClobExample1.vbで、VB.NETのコードは次のとおりです。
Dim charArray(50) As char
Dim numCharsRead As Integer
numCharsRead = myOracleClob.Read(charArray, 0, 50)
Do While (numCharsRead > 0)
Console.WriteLine("numCharsRead = " & numCharsRead)
Dim clobData As New string(charArray, 0, numCharsRead)
Console.WriteLine("clobData = " & clobData)
numCharsRead = myOracleClob.Read(charArray, 0, 50)
Loop BlobExample1.csの手順3では、OracleBlobオブジェクトの Read()メソッドを使用します。 Read()メソッドの呼出形式は次の1つだけです。
int Read(byte [] byteArray, int offset, int count) BlobExample1.csでは、次のC#のコードで、文字をBLOBから読み出して、byteArrayという名前のバイト配列に格納しています。 サンプル・コードでは、データベース・ラウンドトリップごとに50バイトずつBLOBを読み出し、BLOB全体が読み出されるまで繰り返しています。
byte [] byteArray = new byte[50];
Console.WriteLine("byteArray.Length = " + byteArray.Length);
int numBytesRead;
while ((numBytesRead = myOracleBlob.Read(byteArray, 0, 50)) > 0)
{
Console.WriteLine("numBytesRead = " + numBytesRead);
} BlobExample1.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
Dim byteArray(50) As byte
Dim numBytesRead As Integer
numBytesRead = _
myOracleBlob.Read(byteArray, 0, 50)
Do While (numBytesRead > 0)
Console.WriteLine("numBytesRead = " & numBytesRead)
numBytesRead = _
myOracleBlob.Read(byteArray, 0, 50)
Loop LOBを即座に取り出す方法でLOBからデータを読み出す
次に、LOBを即座に取り出す方法を使用して、clob_content.clob_columnに格納したテキスト、およびblob_content.blob_columnに格納したバイナリを読み出す4つのサンプル・プログラムの主要な処理手順を解説します。 次の4つのプログラムについて説明します。
- ClobExample2.cs:clob_content.clob_columnから読み出すC#プログラム
- ClobExample2.vb:ClobExample2.csと同じ処理内容のVB.NET版
- BlobExample2.cs:blob_content.blob_columnから読み出すC#プログラム
- BlobExample2.vb:BlobExample2.csと同じ処理内容のVB.NET版
手順1
手順1では、InitialLOBFetchSizeを1,000バイトに設定します。 この処理をおこなうClobExample2.csおよびBlobExample2.csのC#コードは次のとおりです。
myOracleCommand.InitialLOBFetchSize = 1000; OracleCommandオブジェクトの InitialLOBFetchSizeを設定している点に注意してください。 この処理をおこなうClobExample2.vbおよびBlobExample2.vbのVB.NETコードは次のとおりです。
myOracleCommand.InitialLOBFetchSize = 1000 手順2
手順2は、前出のLOB遅延取出しのサンプル・コードの手順1と同じです。
手順3
ClobExample2.csの手順3では、 GetString()メソッドを使用して、CLOBからデータを取得し、そのデータを表示します。
String clobData = myOracleDataReader.GetString(1);
Console.WriteLine("clobData = " + clobData);ClobExample2.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
Dim clobData As string = myOracleDataReader.GetString(1)
Console.WriteLine("clobData = " & clobData) BlobExample2.csの手順3では、 GetBytes()メソッドを使用してBLOBからデータを取得し、読み出したバイト数を表示します。
byte [] byteArray = new byte[1000];
long numBytesRead = myOracleDataReader.GetBytes(1, (long) 0, byteArray, 0, 1000);
Console.WriteLine("numBytesRead = " + numBytesRead); BlobExample2.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
Dim byteArray(1000) As byte
Dim numBytesRead As long = _
myOracleDataReader.GetBytes(1, 0, byteArray, 0, 1000)
Console.WriteLine("numBytesRead = " & numBytesRead) C#およびVB.NETを使用してLOBに書き込む
OracleDataReaderオブジェクトを使用する場合、LOBに書き込む方法には次の2つがあります。
- CLOBの場合は、 OracleDataReaderの GetOracleClobForUpdate()メソッドを呼び出します。 BLOBの場合は、 GetOracleBlobForUpdate()メソッドを呼び出します。
- SELECT文に FOR UPDATE句を追加し、 GetOracleClob()または GetOracleBlob()メソッドを呼び出して、CLOBまたはBLOBを取得します。
方法1を使用してCLOBに書き込む
ここでは、方法1を使用してclob_content.clob_columnのCLOBに書き込む2つのプログラム例の主要な手順を解説します。 次の2つのプログラムについて説明します。
- ClobExample3.cs:clob_content.clob_columnに書き込むC#プログラム
- ClobExample3.vb:ClobExample3.csと同じ処理内容のVB版
手順1
LOBに対するすべての更新処理は、 OracleTransactionオブジェクトのコンテキスト内で実行する必要があります。 この処理をおこなうClobExample3.csのC#コードは次のとおりです。
OracleTransaction myOracleTransaction = myOracleConnection.BeginTransaction(); ClobExample3.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
Dim myOracleTransaction As OracleTransaction = _
myOracleConnection.BeginTransaction() 手順2
手順2では、行を読み出します。これは、『 LOBをあとで取り出す方法でLOBからデータを読み出す』の手順1と同じです。
手順3
手順3では、 OracleDataReaderの GetOracleClobForUpdate()メソッドを使用して、LOBロケータを取得します。 この処理をおこなうClobExample3.csのC#コードは次のとおりです。
OracleClob myOracleClob = myOracleDataReader.GetOracleClobForUpdate(1); ClobExample3.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
Dim myOracleClob As _
OracleClob = myOracleDataReader.GetOracleClobForUpdate(1) 手順4
手順4では、 OracleClobオブジェクトの Write()メソッドを使用して、CLOBに書き込みます。 Write()メソッドには次の2つの呼出形式があります。
Write(byte [] byteArray, int offset, int count)
Write(char [] charArray, int offset, int count) 引数の意味は以下のとおりです。
- byteArrayと charArrayは、CLOBに書き込むデータが格納された配列です。
- offsetは、CLOB内のデータ書き込み位置です。
- countは、書き込むバイト数または文字数です。
myOracleClob.Erase();
string text = "It is the east, and Juliet is the Sun";
char [] charArray = text.ToCharArray();
myOracleClob.Write(charArray, 0, charArray.Length);
Console.WriteLine("myOracleClob.Value = " + myOracleClob.Value); ClobExample3.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
myOracleClob.Erase()
Dim text As string = "It is the east, and Juliet is the Sun"
Dim charArray() As char = text.ToCharArray()
myOracleClob.Write(charArray, 0, charArray.Length)
Console.WriteLine("myOracleClob.Value = " & myOracleClob.Value) 手順5
手順5では、トランザクションをコミットして、新規のテキストをデータベース内に永続的に格納します。 この処理をおこなうClobExample3.csのC#コードは次のとおりです。
myOracleTransaction.Commit(); ClobExample3.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
myOracleTransaction.Commit() 方法2を使用してCLOBに書き込む
ここでは、方法2を使用してclob_content.clob_columnのCLOBに書き込む2つのプログラム例の主要な手順を解説します。 次の2つのプログラムについて説明します。
- ClobExample4.cs:clob_content.clobに書き込むC#プログラム
- ClobExample4.vb:ClobExample4.csと同じ処理内容のVB.NET版
手順2
手順2では、clob_contentから行を読み出します。 方法2では、 SELECT文に FOR UPDATE句を追加します。 この処理をおこなうClobExample4.csのC#コードは次のとおりです。
myOracleCommand.CommandText =
"SELECT id, clob_column " +
"FROM clob_content " +
"WHERE id = 1 FOR UPDATE";
OracleDataReader myOracleDataReader =
myOracleCommand.ExecuteReader();
myOracleDataReader.Read(); ClobExample4.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
myOracleCommand.CommandText = _
"SELECT id, clob_column " & _
"FROM clob_content " & _
"WHERE id = 1 FOR UPDATE"
Dim myOracleDataReader As _
OracleDataReader = myOracleCommand.ExecuteReader()
myOracleDataReader.Read()手順3
手順3では、CLOBロケータを取得します。 この処理をおこなうClobExample4.csのC#コードは次のとおりです。
OracleClob myOracleClob = myOracleDataReader.GetOracleClob(1); ClobExample4.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
Dim myOracleClob As OracleClob = _
myOracleDataReader.GetOracleClob(1) この手順は、上記の方法1に示した手順と異なります。 方法1では GetOracleClobForUpdate()を呼び出していましたが、ここでは、 GetOracleClob()を呼び出しています。 手順2で FOR UPDATE句を使用しているため、ここでは GetOracleClobForUpdate()を使用する必要はありません。単に、 GetOracleClob()を呼び出すだけで、CLOBへの書き込みを開始できます。 CLOBロケータを設定したあとのCLOBへの書き込み処理は方法1とまったく同じです。
C#およびVB.NETを使用してBFILEからデータを読み出す
BFILEには、ファイル・システム上のファイルへのポインタが格納されます。このポインタを介してファイルにアクセスできます。 ここでは、bfile_content.bfile_columnのBFILEが指しているtextContent.txtファイルのテキストを読み出す2つのプログラム例の主な手順を解説します。 次の2つのプログラムについて説明します。
- BfileExample1.cs:C#プログラム
- BfileExample1.vb:BfileExample1.csと同じ処理内容のVB.NET版。
手順1では、bfile_content表から行を読み出します。 この処理をおこなうBfileExample1.csのC#コードは次のとおりです。
myOracleCommand.CommandText =
"SELECT id, bfile_column " +
"FROM bfile_content " +
"WHERE id = 1";
OracleDataReader myOracleDataReader =
myOracleCommand.ExecuteReader();
myOracleDataReader.Read(); BfileExample1.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
myOracleCommand.CommandText = _
"SELECT id, bfile_column " & _
"FROM bfile_content " & _
"WHERE id = 1"
Dim myOracleDataReader As OracleDataReader = _
myOracleCommand.ExecuteReader()
myOracleDataReader.Read() 手順2
手順2では、 OracleDataReaderオブジェクトの GetOracleBFile()メソッドを呼び出して、BFILEを取得します。 BfileExample1.csの次のC#コードでは、ディレクトリ名、ファイル名、およびファイルが存在するかどうかも表示しています。
OracleBFile myOracleBFile = myOracleDataReader.GetOracleBFile(1);
Console.WriteLine("myOracleBFile.DirectoryName = " +
myOracleBFile.DirectoryName);
Console.WriteLine("myOracleBFile.FileName = " +
myOracleBFile.FileName);
Console.WriteLine("myOracleBFile.FileExists = " +
myOracleBFile.FileExists); BfileExample1.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
Dim myOracleBFile As OracleBFile = _
myOracleDataReader.GetOracleBFile(1)
Console.WriteLine("myOracleBFile.DirectoryName = " & _
myOracleBFile.DirectoryName)
Console.WriteLine("myOracleBFile.FileName = " & _
myOracleBFile.FileName)
Console.WriteLine("myOracleBFile.FileExists = " & _
myOracleBFile.FileExists) 手順3
BfileExample1.csの手順3では、BFILEを開きます。
myOracleBFile.OpenFile(); BfileExample1.vbのVB.NETコードは、上記のC#コードとまったく同じです。
手順4
BfileExample1.csの手順4では、 Read()メソッドを使用してBFILEから読み出します。 次のコードでは、BFILEからデータを読み出して、byteArrrayという名前のバイト配列に格納しています。また、この配列内のデータを System.Text.Encoding.ASCII.GetString()メソッドで文字列に変換して、データを画面上で確認できるようにしています。
byte [] byteArray = new byte[1000];
int offset = 0;
int numBytesRead;
while ((numBytesRead = myOracleBFile.Read(byteArray, offset, 1000-offset)) > 0)
{
Console.WriteLine("numBytesRead = " + numBytesRead);
String text =
System.Text.Encoding.ASCII.GetString(byteArray, 0, numBytesRead);
Console.WriteLine("text = " + text);
offset += numBytesRead;
}
BfileExample1.vbで、上記と同じ処理をおこなうVB.NETのコードは次のとおりです。
Dim byteArray(1000) As byte
Dim offset As Integer = 0
Dim numBytesRead As Integer
numBytesRead = myOracleBFile.Read(byteArray, offset, 1000-offset)
Do While (numBytesRead > 0)
Console.WriteLine("numBytesRead = " & numBytesRead)
Dim text As string = _
System.Text.Encoding.ASCII.GetString(byteArray, 0, numBytesRead)
Console.WriteLine("text = " & text)
offset += numBytesRead
numBytesRead = myOracleBFile.Read(byteArray, offset, 1000-offset)
Loop 手順5
BfileExample1.csの手順5では、 Close()メソッドを使用してBFILEを閉じます。
myOracleBFile.Close(); BfileExample1.vbのVB.NETコードは、上記のC#コードとまったく同じです。
結論
この記事では、C#およびVB.NETからラージ・オブジェクトにアクセスする方法を説明しました。また、BFILEを介してデータを読み出す方法も説明しました。
Jason Price は、 技術コンサルタント兼ライターです。Microsoft Certified Professionalの資格を保有しており、ソフトウェア業界で10年以上の実績をもつ、Oracle Certified Database AdministratorおよびOracle Certified Application Developerです。 著書として、『 Oracle Database 10g SQL 』(McGraw-Hill/Osborne、2004年)、『 Mastering C# Database Programming』 (Sybex、2004年)、『 Mastering Visual C# .NET Programming』 (Sybex、2003年)、 『 Oracle9i JDBC Programming』 (McGraw-Hill/Osborne、2002年)、『 Java Programming with Oracle SQLJ』 (O'Reilly、2001年)があります。