Реферат: Работа с объектами большого объема в MS SQL и ADO

'Создаем Recordset

Set rs = conn.Execute("select * from blob_test", ra)

'Производим связывание данных

Set imgImg.DataSource = rs

'Здесь выполняется фактическая пересылка данных

'и вывод изображения на экран

imgImg.DataField = "img"

sb.SimpleText = "Ready"

...

Если нужно просто сохранить графический объект в файл на диске, алгоритм несколько меняется. Вместо связывания данных нужно открыть файл на запись и записать в него данные. Однако все не так просто:

'Открываем файл как бинарный для записи

Open "c:\temp_img.bmp" For Binary Access Write As #1

Dim b() As Byte

'Выделяем память под массив

ReDim b(Len(rs.Fields("img").Value))

'Копирование данных в массив

b = rs.Fields("img").Value

'запись в файл

Put #1, , b

Close #1

В этом примере мне пришлось скопировать данные во временный буфер, так как инструкция Put добавляет к некоторым типам, экземпляры которых вы хотите сохранить, разные заголовки. Зачем это сделано, мне не совсем понятно; видимо разработчики хотели упростить реализацию сохранения/восстановления состояния переменных программы, однако это у них не очень хорошо получилось – для объектов эта инструкция не поддерживается. В случае сохранения таким образом:

Put #1, , rs.Fields("img").Value

в файл запишется одному лишь богу известный заголовок, который будет мешать воспринимать этот файл как нормальный bmp. Поэтому я вынужден копировать данные в дополнительный массив байтов и сохранять уже его.

Для чтения графической информации из файла можно воспользоваться инструкцией Get.

Все идет хорошо до тех пор, пока не понадобится читать/писать бинарные данные небольшими блоками. Здесь на помощь приходят следующие методы:

AppendChunk – применим к полям с атрибутом adFldLong. Если метод вызван первый раз с тех пор, как вы редактируете текущее поле, данные перезаписываются. Иначе - метод добавляет данные к существующему значению. Другими словами, если вы только начали редактировать поле, вызвав метод AppendChunk, содержащиеся в нем до этого значения будут потеряны. Однако последующие вызовы метода будут добавлять данные к существующему значению. Как только вы начнете редактировать другое поле, возможность добавлять данные исчезнет. Этот метод также можно вызвать для параметров с установленным атрибутом adParamLong. Для параметров данные всегда добавляются к существующим.

GetChunk – применим к полям с атрибутом adFldLong. Возвращает заданное количество байтов с позиции, на которой закончилось предыдущее считывание данных. До тех пор, пока вы не перейдете к работе с другим полем, данные будут считываться последовательно. Если вы начали работать с другим полем, а потом вернулись к этому, данные снова будут читаться с нулевого смещения.

Эти два метода позволяют работать с порциями (chunks) данных. Например, вот такой код позволяет считать всего лишь первые 100 байт данных:

Dim b() As Byte

К-во Просмотров: 662
Бесплатно скачать Реферат: Работа с объектами большого объема в MS SQL и ADO