2011-02-07 46 views
6

Estoy tratando de leer un BLOB de una base de datos Oracle. La función GetFileContent toma p_file_id como parámetro y devuelve un BLOB. El BLOB es un archivo DOCX que debe escribirse en una carpeta en alguna parte. Pero no puedo entender cómo leer el BLOB. Sin duda hay algo almacenado en el parámetro de valor_devuelto-despuésIntentando leer un blob

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

El valor es {byte [9946]}. Pero me da un error al ejecutar

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

Dice InvalidOperationException fue capturado: "No existen datos para la fila o columna."

Aquí está el código:

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

¿Cómo puedo leer el BLOB de la función?

+0

solución final con el código fuente completo de muestra trabajando al respecto? – Kiquenet

Respuesta

2

Parece que está utilizando Microsoft Oracle Client. Probablemente desee utilizar los objetos LOB en lugar de utilizar GetBytes (...).

Creo que el primer enlace a continuación sería el más fácil para usted. He aquí un extracto:

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

En una nota lateral, se amortiza el cliente de Microsoft Oracle. Es posible que desee consultar el cambio a ODP.net de Oracle, ya que será el único cliente "Oficialmente compatible" en el futuro.