2011-02-07 7 views
6

OracleデータベースからBLOBを読み込もうとしています。関数GetFileContentは、p_file_idをパラメータとして受け取り、BLOBを返します。 BLOBはDOCXファイルで、どこかのフォルダに書き込む必要があります。しかし、私はBLOBをどのように読むのかを決めることはできません。ブロブを読み込もうとしています

OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); 

値は{byte [9946]}の後にreturn_value-paramaterに格納されます。

long retrievedBytes = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize); 

を実行するときしかし、私はエラーを取得することは、InvalidOperationExceptionががキャッチされたと言う:「データが行または列に存在しません」ここで

はコードです:

cmd = new OracleCommand("GetFileContent", oraCon); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add("p_file_id", OracleType.Number).Direction = ParameterDirection.Input; 
cmd.Parameters[0].Value = fileID; 
cmd.Parameters.Add("return_value", OracleType.Blob).Direction = ParameterDirection.ReturnValue; 
cmd.Connection.Open(); 

OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); 
reader.Read(); 

MemoryStream memory = new MemoryStream(); 
long startIndex = 0; 
const int ChunkSize = 256; 
while (true) 
{ 
    byte[] buffer = new byte[ChunkSize]; 
    long retrievedBytes = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize); //FAILS 
    memory.Write(buffer, 0, (int)retrievedBytes); 
    startIndex += retrievedBytes; 
    if (retrievedBytes != ChunkSize) 
     break; 
} 
cmd.Connection.Close(); 
byte[] data = memory.ToArray(); 
memory.Dispose(); 

私は関数からBLOBを読み取ることができますどのように?

+0

完全なソースコードサンプルを扱った最終的な解決策はありますか? – Kiquenet

答えて

2

Microsoft Oracle Clientを使用しているようです。おそらく、GetBytes(...)を使用するのではなく、LOBオブジェクトを使用したいと考えています。

私は以下の最初のリンクがあなたにとって最も簡単だと思います。ここに抜粋がある:サイドノートで

using(reader) 
{ 
     //Obtain the first row of data. 
     reader.Read(); 
     //Obtain the LOBs (all 3 varieties). 
     OracleLob BLOB = reader.GetOracleLob(1); 
     ... 

     //Example - Reading binary data (in chunks). 
     byte[] buffer = new byte[100]; 
     while((actual = BLOB.Read(buffer, 0, buffer.Length)) >0) 
     Console.WriteLine(BLOB.LobType + ".Read(" + buffer + ", " + buffer.Length + ") => " + actual); 

     ... 
} 

OracleLob::Read Method

OracleLob Class

OracleDataReader::GetOracleLob Method

、マイクロソフトのOracleクライアントは、減価償却されています。オラクルのODP.netへの移行については、「公式にサポートされている」唯一のクライアントであることを考えてみてください。

関連する問題