-Подписка по e-mail

 

 -Поиск по дневнику

Поиск сообщений в braindump

 -Интересы

802.11 802.11b 802.11g access bsd diskless ethereal f90 f95 fortran gambas google earth gps internet kismet openev postgis qgis rdesktop sh

 -Сообщества

Участник сообществ (Всего в списке: 4) Археология cyberpunks Free_OS freebsd

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 19.10.2006
Записей:
Комментариев:
Написано: 793

Работа с blob-полями Postgresql из MS Access

Дневник

Четверг, 26 Июля 2007 г. 10:25 + в цитатник
Вот решил малость осветить проблему, ибо в инете информации мало. Понятно, что Access - типа несерьёзно, кто-то скажет, что геморрой и т.д., но на работе пользуемся, так уж сложилось исторически, и отказываться пока не собираемся. Может, до появления нормальных стабильных версий Kexi или ещё чего-нибудь в этом роде, желательно кроссплатформенного...
Поле blob в Postgresql называется oid и содержит целочисленное значение, представляющее собой генерируемый сервером идентификатор бинарного объекта при загрузке последнего в базу функцией lo_import. Для выгрузки используется соответственно функция lo_export. Файлы хранятся вне таблиц. Если поставить в систему соответствующий драйвер odbc, то таблицы Postgresql можно связывать и использовать без всякого программирования, однако ж поля oid видятся в Access как длинные целые, и что с ними дальше делать, не очень понятно. Программно ковыряться с odbc как-то не вдохновляет, смутно вспоминается рубеж тысячелетий: DAO, сквозные запросы... Ныне более привычен ADO. Итак, ставим PostgreSQL OLE DB Provider, после чего метод Open объекта ADODB.Connection начинает понимать провайдера по имени PostgreSQL, и начинаем писать. Я приведу несколько строк на vb, иллюстрирующих загрузку и выгрузку файла.
'Объявим переменные
Dim Conn As New ADODB.Connection, Rst As ADODB.Recordset
'Подключаемся. Если нужно, можно задать и пароль - password
Call Conn.Open("Provider='PostgreSQL';Data Source = '[адрес/имя сервера]';location ='[имя базы]';User ID = '[имя пользователя]'")
'Записываем файл в таблицу tst, содержащую поля serial id и oid file
Conn.Execute ("INSERT INTO tst(file) VALUES (lo_import('/tmp/arch.test'));")
'Создаём из таблицы объект recordset
Set Rst = Conn.Execute("SELECT * FROM objects;")
'и переходим к последней записи
Rst.MoveLast
'Выгружаем файл, на который ссылается последняя запись
Conn.Execute ("SELECT lo_export(tst.file,'/tmp/arch1.test') FROM tst WHERE id=" & Rst.Fields("id").Value & ";")

Вот примерно так незамысловато. Нужно учитывать, что SQL запросы передаются серверу, который, конечно же, может ничего не знать о локальной файловой системе. В примере загрузка/выгрузка осуществлялась в пределах файловой системы компьютера, на котором выполняется сервер. Однако ж ничто не мешает, например, замонтировать на стороне клиента самбовую шару сервера и организовать предварительное копирование файлов в неё.
Рубрики:  Программирование

Метки:  

 Страницы: [1]