В этом примере мне пришлось скопировать данные во
временный буфер, так как инструкция Put добавляет к некоторым типам, экземпляры
которых вы хотите сохранить, разные заголовки. Зачем это сделано, мне не совсем
понятно; видимо разработчики хотели упростить реализацию
сохранения/восстановления состояния переменных программы, однако это у них не
очень хорошо получилось – для объектов эта инструкция не поддерживается. В
случае сохранения таким образом:
Put
#1, , rs.Fields("img").Value
в файл запишется одному лишь богу известный заголовок, который будет мешать воспринимать этот файл как нормальный bmp. Поэтому я
вынужден копировать данные в дополнительный массив байтов и сохранять уже его.
Для чтения графической информации из файла можно
воспользоваться инструкцией Get.
Все идет хорошо до тех пор, пока не понадобится читать/писать
бинарные данные небольшими блоками. Здесь на помощь приходят следующие методы:
AppendChunk – применим к полям с атрибутом adFldLong.
Если метод вызван первый раз с тех пор, как вы редактируете текущее поле, данные перезаписываются. Иначе - метод добавляет данные к существующему
значению. Другими словами, если вы только начали редактировать поле, вызвав
метод AppendChunk, содержащиеся в нем до этого значения будут потеряны. Однако
последующие вызовы метода будут добавлять данные к существующему значению. Как
только вы начнете редактировать другое поле, возможность добавлять данные
исчезнет. Этот метод также можно вызвать для параметров с установленным
атрибутом adParamLong. Для параметров данные всегда добавляются к существующим.
GetChunk – применим к полям с атрибутом adFldLong.
Возвращает заданное количество байтов с позиции, на которой закончилось
предыдущее считывание данных. До тех пор, пока вы не перейдете к работе с
другим полем, данные будут считываться последовательно. Если вы начали работать
с другим полем, а потом вернулись к этому, данные снова будут читаться с
нулевого смещения.
Эти два метода позволяют работать с порциями (chunks)
данных. Например, вот такой код позволяет считать всего лишь первые 100 байт
данных:
Dim
b() As Byte
b =
rs.Fields("img").GetChunk(100)
Это все замечательно, но как же рекомендации MSDN
использовать более гибкий объект Stream? Сейчас мы и до него доберемся.
Работа с изображением с помощью Stream на С++
Я выбрал С++, так как с VB6 мы уже поработали
(хорошего помаленьку), и потому, что большинство вопросов касается именно С++.
(На RSDN ходят настоящие индейцы.)
Алгоритм действий примерно тот же, что и в предыдущем
примере:
Подготовка соединения.
Открытие соединения.
Выборка данных в Recordset.
Создание и открытие объекта Stream.
Чтение данных в Stream.
Работа со Stream.
Код реализации алгоритма приведен далее, а сейчас я бы
хотел остановиться на шестом пункте, так как он выглядит слишком расплывчато, а
мы, программисты, чужды неопределенности.
Объект Stream (поток) предназначен специально для
работы с нереляционными и двоичными данными. Его возможности очень велики.
Он поддерживает интерфейс IStream, а значит, его можно
спокойно пересылать по сети, сохранять в составной файл и загружать из него изображение.
Его можно сохранять/загружать в/из файла.
Рекомендуем скачать другие рефераты по теме: реферат на тему україна, bestreferat ru.