Пытаюсь прочитать блоб - PullRequest
6 голосов
/ 07 февраля 2011

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

2 голосов
/ 07 февраля 2011

Похоже, вы используете клиент 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 :: Метод чтения

Класс OracleLob

OracleDataReader :: GetOracleLob Method

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...