2011-02-07 21 views
6

Bir Oracle veritabanından bir BLOB okumaya çalışıyorum. GetFileContent işlevi bir paramater olarak p_file_id alır ve bir BLOB döndürür. BLOB, bir klasörde bir yere yazılması gereken bir DOCX dosyasıdır. Ama BLOB'un nasıl okunacağını tam olarak anlayamıyorum. dönen_değer-paramater saklanan bir şeyBir blob okumaya çalışıyorum

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

sonra kesinlikle yoktur değerdir {byte [9946]}.

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

O InvalidOperationException yakalandı diyor

yürütürken Ama bir hata alıyorum: "Hiçbir veri satır veya sütun için var"

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

nasıl işlevinden BLOB okuyabilir: Burada

kodudur?

+0

Tam kaynak kod örneği ile herhangi bir nihai çözüm bu konuda çalışıyor? – Kiquenet

cevap

2

Microsoft Oracle İstemcisini kullandığınızı düşünüyor. Büyük olasılıkla GetBytes (...) kullanmak yerine LOB nesnelerini kullanmak istersiniz.

Aşağıdaki ilk bağlantı sizin için en kolay olacağını düşünüyorum. İşte bir alıntıdır: Bir yan not

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

Microsoft, Oracle istemci amortismana ediliyor. Oracle'ın ODP.net'e geçiş yapmak isteyebilirsiniz, çünkü bu, ilerleyen tek "Resmi Desteklenen" müşteri olacaktır.

İlgili konular