Эффективный способ чтения данных BLOB в C# / SQL 2005

каков наиболее эффективный способ чтения поля изображения SQL 2005 с помощью C# 3.5?

прямо сейчас у меня есть (byte[])cm.ExecuteScalar("...").

Если бы я не мог прочитать все содержимое поля в памяти, это было бы неплохо.

2 ответов


смотрите это отлично статью или это блоге для длинного объяснения, как это сделать.

в принципе, вам нужно использовать SqlDataReader и указать SequentialAccess к нему, когда вы его создаете-тогда вы можете читать (или писать) BLOB из базы данных в кусках любого размера лучше для вас.

в основном что-то вроде:

SqlDataReader myReader = getEmp.ExecuteReader(CommandBehavior.SequentialAccess);

while (myReader.Read())
{
   int startIndex = 0;

   // Read the bytes into outbyte[] and retain the number of bytes returned.
   retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize);

   // Continue reading and writing while there are bytes beyond the size of the buffer.
   while (retval == bufferSize)
   {
      // write the buffer to the output, e.g. a file
      ....

      // Reposition the start index to the end of the last buffer and fill the buffer.
      startIndex += bufferSize;
      retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize);
   }

   // write the last buffer to the output, e.g. a file
   ....
}

// Close the reader and the connection.
myReader.Close();

Марк


трюк здесь заключается в использовании ExecuteReader в последовательном режиме и считывании данных из IDataReader. вот версия для CLOBs - капли практически идентичны, но с byte[] и GetBytes(...).

что-то типа:

using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
    byte[] buffer = new byte[8040]; // or some multiple (sql server page size)
    while (reader.Read()) // each row
    {
        long dataOffset = 0, read;
        while ((read = reader.GetBytes(
            colIndex, dataOffset, buffer, 0, buffer.Length)) > 0)
        {
            // TODO: process "read"-many bytes from "buffer"
            dataOffset += read;
        }
    }
}