В предыдущей статье мы поговорили о том, как заносить изображения в БД. В данной статье мы рассмотрим обратный процесс – чтение содержимого поля таблицы, хранящей изображение.
По-прежнему мы имеем простую таблицу:

В которой поле ImageByte хранит в себе последовательность байт некоего изображения.
Для начала, настроим объекты соединения и команды выборки:
SqlConnection connection = new SqlConnection(
"MyConnectionString");
SqlCommand command = new SqlCommand(
"SELECT * FROM MyTable WHERE …", connection);
Затем используем объект SqlDataReader:
connection.Open();
SqlDataReader datareader = cmd.ExecuteReader();
datareader.Read();
Далее нам обязательно следует получить действительный размер буфера, который займет последовательность вытянутых из поля таблицы быйт:
int bLength=(int)datareader.GetBytes(1,0,null,0,int.MaxValue);
Параметры указаны в следующем порядке: номер поля в ридере (поле ImageByte является вторым столбцом таблицы), стартовая позиция для чтения (0 для старта с самого начала), выходной буфер-массив (пока null), стартовая позиция для записи в массив-буфер (0 для записи с самого начала), максимальный размер буфера для записи в буфер.
И определяем буфер-массив:
byte[] bBuffer = new byte[bLength];
Теперь вытягиваем последовательность байт и заполняем ими наш массив:
datareader.GetBytes(1, 0, bBuffer, 0, bLength);
connection.Dispose();
Создаем поток из данных буфер-массива:
MemoryStream mStream = new MemoryStream(bBuffer);
Теперь с объектом mStream могут работать многие визуальные контролы на форме, или использовать для дальнейших программных преобразований.