2011-02-07 75 views
6

我正在嘗試從Oracle數據庫中讀取BLOB。函數GetFileContent將p_file_id作爲參數並返回一個BLOB。 BLOB是需要在某個文件夾中寫入的DOCX文件。但我無法弄清楚如何閱讀BLOB。試圖讀取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 2013-10-29 15:00:46

回答

2

看起來您正在使用Microsoft Oracle客戶端。您可能想要使用LOB對象而不是使用GetBytes(...)。

我認爲下面的第一個鏈接對你來說是最簡單的。下面是摘錄:

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客戶端正在貶值。您可能需要考慮切換到Oracle的ODP.net,因爲這將是唯一的「正式支持」客戶端。