powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
8 сообщений из 8, страница 1 из 1
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
    #33788945
vvvolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программа через ODBC подключается к PostgreSQL. SQL запросы работают без проблем. Проблема с записью в базу двоичных данных (картинки в jpg формате). Насколько я понял, в PostgreSQL для хранения двоичных данных предназначены типы BYTEA и OID. Экспериментировал с ними обоими.

Касательно OID пришёл к выводу, что видимо работа через ODBC с ним вообще невозможна потому, что этот тип какой-то свой PostgreSQL-евский.

Кой-какую информацию удалось записать в базу, используя тип BYTEA. Теперь что касается методов записи. Попытки доступа с помощью функции CreateBlobStream класса TADOTable приводят к исключению "Invalid class typecast". Запись в поле типа BYTEA, используя AdoTable1.FieldByName('fld1').Value := b; {где b: array of byte} приводит к тому, что данные в базу попадают, но не всегда. Например, если в массив b записать символы '1', '2', '3' то эти три байта успешно записываются в базу. А если в массив b записать символы '!', ' ', '3' то при выполнении строки AdoTable1.FieldByName('fld1').Value := b; возникает исключение EOleException "invalid byte sequence for encoding UTF8: 0xba" (а следом EDatabaseError с таким же текстом).

Это последнее исключение меня просто добивает, поскольку совершенно не ясно какое отношение имеет кодировка UTF8 (да и какая бы то ни была другая) к данным, которые я в Дельфи представил как двоичные (array of byte) и в ПостгреСкуель записываю в поле, предназначенное для хранения двоичных данных (BYTEA).

В этой ситуации я вижу два выхода: 1) или использовать текстовое поле и писать в него двоичные данные, закодированные BASE64 2) или переходить на другие библиотеки доступа к данным, например ZeosDBO...

Оба варианта мне не нравятся. Если кто знает как обращаться к двоичным данным в PostgreSQL через ODBC, подскажите пожалуйста!
...
Рейтинг: 0 / 0
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
    #33789656
Opilki_Inside
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем тебе ZEOS не нравится? Он работает на порядок быстрее чем ODBC. Если ты хочешь что бы твое приложение было универсально, то ZEOS поддерживает и некоторые другие драйвера СУБД.

Через ODBC ты мог бы просто в SQL запросе писать lo_import / lo_export. Но тут есть единственное ограничение - в качестве параметров в эту функцию ты должен будешь передать полный путь к файлу относительно сервера БД .

Еще как вариант - ты мог бы просто вызывать функции чтения/запись больших объектов из драйвера libpq.dll и работать с типом OID.

И еще, если ты хочешь использовать BYTEA, то лучше всего туда копировать данные в 8-ричной кодировке. Тогда будет меньше проблем с квортированием. Т.е. нужно перевести строку в что-то типа '\137\057\059\212' и т.д.
...
Рейтинг: 0 / 0
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
    #33790011
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вах! Зачем что-то еще когда уже все есть? :)

Лучший способ записать что-то в блоб поле (bytea) нужно использовать параметры. И отлично все работает. Есдинственно что возможно будет нужно поставить ксакие-то галочки в насторойках ODBC подсоединения.
...
Рейтинг: 0 / 0
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
    #33790318
vvvolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Opilki_Inside
Библиотеку ZEOS у меня сходу использовать тоже не получилось. При подключении к базе в ZEOS-овской dll возникает exception "при обращении по такому-то адресу памяти". Из типа ошибки даже не ясно в чём проблема (((

Andrey Daeron
Какие параметры имелись в виду? У меня не работает.

А галочки в насторойках ODBC подсоединения я уже смотрел, какие-то даже менял. Но результата не дало :-) Галочки это дело такое, вариантов проставления галочек слишком много. Если у галочки две позиции, а галочек N штук то вариантов расстановок галочек 2 в степени N - много!!! А если серьёзно, то не увидел я там галочек, которые мне могли бы помочь...
...
Рейтинг: 0 / 0
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
    #33791003
vvvolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проставлением "галочки" в настройках ODBC соединения добился, что поле воспринимается как BLOB (TBlobField). Но ошибка "invalid byte sequence for encoding UTF8" осталась при вызове метода Post.

Как может быть связано BLOB поле и кодировка UTF8?

Opilki_Inside
Запись "в 8-ричной" кодировке тоже не получилась. При записи последовательности вида '\137\057\059\212' возникает та же ошибка про UTF8.
...
Рейтинг: 0 / 0
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
    #33791421
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишем в TADOQuery что-то по типу:
Код: plaintext
1.
INSERT INTO my_table (my_blob) VALUES (:my_blob);
Потом делаем:
my_ado.ParamByName('my_blob).Type:=ftBlob;
my_ado.ParamByName('my_blob).Value:=my_big_string_with_data;
my_ado.Exec;
Усе. Дальше +/- настройки ODBC.
Гарантировано работает из-под Делфей 6, 2006, на PG 8.0,8.1. С соответсвующими версиями ODBC.
...
Рейтинг: 0 / 0
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
    #33791564
vvvolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С практической точки зрения пока вопрос решился. То есть, удалось записывать и читать бинарные данные.

Решение оказалось в использовании версии ODBC драйверов, которая называется "PostgreSQL ANSI (8.1.2.0)". Ещё существуют версии "PostgreSQL Unicode (8.1.2.0)" и просто "PostgreSQL (8.2.0.2)", но в них работать с блобами не удалось по описанной выше причине.

Вопросов осталось два: что всё это значит с теоретической точки зрения и какими проблемами может грозить на практике :)

Andrey Daeron
Спасибо за ответ! По поводу версии ODBC "PostgreSQL ANSI (8.1.2.0)" могу подтвердить, что всё действительно работает :-)
...
Рейтинг: 0 / 0
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
    #33792586
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvvolfС практической точки зрения пока вопрос решился. То есть, удалось записывать и читать бинарные данные.

Andrey Daeron
Спасибо за ответ! По поводу версии ODBC "PostgreSQL ANSI (8.1.2.0)" могу подтвердить, что всё действительно работает :-)
Хм. Я с другими драйверами и не работал-то :) . Впрочем, если есть проблемы именно с параметрами - я думаю без проблем можно пообщатся с разработчиками этого драйвера.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]