2011-02-07 68 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,因为这将是唯一的“正式支持”客户端。