Доступ к полям BLOB в MySQL из Visual Basic 6

Мой перевод статьи Майка Хиллира (Mike Hillyer).

Одна из сильных сторон MySQL является в использовании полей типа BLOB  для больших двоичных объектов. Эти поля используются для хранения необработанных двоичных данных, как правило, файлов, которые можно извлечь и работать как и с другими общими типами данных. Один из простейших примеров — хранение изображений в базе данных для отображения их на сайте. В моем последнем проекте, системе управления взаимодействием с клиентами (CRM-система) BLOB-поля используются для хранения различных бинарных файлов, связанных с клиентами, таких, как их фотографии, сканы их документов и корреспонденции. Трудности возникают при доступе к ним из VB. До ADO 2.5 единственный способ перемещения данных в/из MySQL BLOB-полей заключалась в использовании методов appendchunk и getchunk. Они заключаются в том, что файл загружается в переменную типа variant и отправляется на серевер путем разбиения его на части и посылки их в цикле по одной.  В ADO 2.5 был добавленн объект stream (поток), сильно упрощающий работу с MySQL BLOB-полями. В этой статье я расскажу об его использовании. Статью Microsoft’а по этому объекту можно найти здесь.

Перед началом я рекомендую вам убедится, что у вас установленна последняя версия сервис-пака для VB. При наличии последнего SP можно быть уверенным, что у вас имеется последняя версия ADO. Также к проекту должна быть подключена последняя версия ActiveX Data Objects Library. Я также предпологаю, что у Вас установлен MySQL, а также последняя версия  ODBC драйвера. ПРИМЕЧАНИЕ: Чтобы избежать ошибок, рекомендуется версия 3.51.03 или выше.

Конфигурация MySQL

Теперь, когда ADO установлен, мы можем использовать его для доступа к нашим MySQL BLOB-полям. Наш первый шаг — это создание таблиц, для которых мы будем получать доступ. В своих таблицах файлов я обычно делаю 4 столбца: столбец AUTO_INCREMENT соответствующего размера (обычно SMALLINT) для первичного ключа, столбец VARCHAR для имени файла, столбец UNSIGNED MEDIUMINT для хранения размера файла и столбец MEDIUMBLOB для хранения самого файла. Для примера, я буду использовать следующее определение:

CREATE TABLE files(file_id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,file_name VARCHAR(64) NOT NULL,file_size MEDIUMINT UNSIGNED NOT NULL,file MEDIUMBLOB NOT NULL);

Логинясь к MySQL, мы должны изменить системную переменную max_allowed_packet. Эта переменная определяет, насколько болшим может быть пакет, передаваемый MySQL серверу. По умолчанию, сервер принимает от нашего клиентского приложения один мегабайт. Если ваши файлы не превышают этот размер, то все будет нормально, в противном случае это значение должно быть увеличенно. Я ставлю max_allowed_packet равным 15Mb. В MySQL 3.x его предел — 16Mb, в 4.х предел определяется только вашей системной памятью, вплоть до теоретических 2Gb. Лично для меня 15Mb более, чем достаточно, особенно в связи с тем, что мои клиенты подключаются удаленно, используя в лучшем случае DSL. Если вам нужно изменить это значение, вы можете сделать это путем добавления строки max_allowed_packet=15M в файл my.cnf или использовать запрос SET max_allowed_packet=15M;

Строка соединения

Теперь, когда у нас есть настроенные MySQL и VB, можно приступить к написанию клиентского приложения. Сперва давайте взглянем на строку соединения. Она определяет, как VB будет соединяться с сервером, конфигурацию ODBC драйвера, адрес сервера, имя пользователя и пароль, используемые для соединения и имя БД. В дополнение можно указать дополнительные опции для соединения.  Ниже приведенна строка соединения, которую я использую в своем приложении.

DRIVER={MySQL ODBC 3.51 Driver};SERVER=123.456.789.100;DATABASE=mysqldatabase;UID=sampleuser;PWD=12345;OPTION=16427

Опции для соединения включают в себя следующее:

1 — Клиент может не справиться с реальной шириной возращаемой колонки.

2 — Возвращает ли  MySQL число найденных строк

8 — Разрешить большие значения. Поскольку мы хотим передавать значения BLOB (большие пакеты), эта опция должна быть установленна.

32 — Поддержка динамического курсора

16384 — Перевести значения типа LongINT в INT, чтобы быть уверенными, что большие числовые значения правильно истолкованны.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *