2011-02-07 10 views
6

Tôi đang cố gắng đọc BLOB từ cơ sở dữ liệu Oracle. Hàm GetFileContent lấy p_file_id làm paramater và trả về BLOB. BLOB là một tệp DOCX cần phải được viết trong một thư mục ở đâu đó. Nhưng tôi không thể tìm ra cách để đọc BLOB. Chắc chắn có điều gì đó được lưu trữ trong return_value-paramater sauĐang cố đọc một đốm màu

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

Giá trị là {byte [9946]}. Nhưng tôi gặp lỗi khi thực hiện

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

Nó nói InvalidOperationException đã bị bắt: "Không có dữ liệu cho hàng hoặc cột".

Đây là mã:

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(); 

Làm thế nào tôi có thể đọc các BLOB từ chức năng?

+0

bất kỳ giải pháp cuối cùng nào có mẫu mã nguồn đầy đủ hoạt động về nó? – Kiquenet

Trả lời

2

Có vẻ như bạn đang sử dụng Microsoft Oracle Client. Bạn có thể muốn sử dụng các đối tượng LOB thay vì sử dụng GetBytes (...).

Tôi nghĩ rằng liên kết đầu tiên bên dưới sẽ dễ dàng nhất cho bạn. Dưới đây là một đoạn trích:

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

Trên một mặt lưu ý, khách hàng Microsoft Oracle đã được khấu hao. Bạn có thể muốn xem xét chuyển sang ODP.net của Oracle, vì đó sẽ là khách hàng "Chính thức được hỗ trợ" duy nhất tiến lên phía trước.