Попытка прочитать blob

Я пытаюсь прочитать BLOB из базы данных Oracle. Функция GetFileContent принимает p_file_id в качестве параметра и возвращает BLOB. BLOB-это DOCX-файл, который нужно записать в папку где-нибудь. Но я не могу понять, как читать кляксу. Определенно что-то хранится в return_value-paramater после

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

значение равно {byte[9946]}. Но я получаю ошибку при выполнении

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 из функции?

1 ответов


Похоже, вы используете клиент Microsoft Oracle. Вероятно, вы хотите использовать объекты LOB, а не использовать GetBytes (...).

Я думаю, что первая ссылка ниже будет самый простой для вас. Вот отрывок:--2-->

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:: Читать Метод

Класс OracleLob

OracleDataReader:: Метод GetOracleLob

на боковой ноте Microsoft Oracle клиент обесценивается. Возможно, вы захотите перейти на Oracle ODP.net, так как это будет единственный "официально поддерживаемый" клиент, продвигающийся вперед.