Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
|
|||
|---|---|---|---|
|
#18+
Программа через 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, подскажите пожалуйста! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2006, 23:18 |
|
||
|
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
|
|||
|---|---|---|---|
|
#18+
А чем тебе ZEOS не нравится? Он работает на порядок быстрее чем ODBC. Если ты хочешь что бы твое приложение было универсально, то ZEOS поддерживает и некоторые другие драйвера СУБД. Через ODBC ты мог бы просто в SQL запросе писать lo_import / lo_export. Но тут есть единственное ограничение - в качестве параметров в эту функцию ты должен будешь передать полный путь к файлу относительно сервера БД . Еще как вариант - ты мог бы просто вызывать функции чтения/запись больших объектов из драйвера libpq.dll и работать с типом OID. И еще, если ты хочешь использовать BYTEA, то лучше всего туда копировать данные в 8-ричной кодировке. Тогда будет меньше проблем с квортированием. Т.е. нужно перевести строку в что-то типа '\137\057\059\212' и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2006, 11:40 |
|
||
|
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
|
|||
|---|---|---|---|
|
#18+
Вах! Зачем что-то еще когда уже все есть? :) Лучший способ записать что-то в блоб поле (bytea) нужно использовать параметры. И отлично все работает. Есдинственно что возможно будет нужно поставить ксакие-то галочки в насторойках ODBC подсоединения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2006, 13:16 |
|
||
|
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
|
|||
|---|---|---|---|
|
#18+
Opilki_Inside Библиотеку ZEOS у меня сходу использовать тоже не получилось. При подключении к базе в ZEOS-овской dll возникает exception "при обращении по такому-то адресу памяти". Из типа ошибки даже не ясно в чём проблема ((( Andrey Daeron Какие параметры имелись в виду? У меня не работает. А галочки в насторойках ODBC подсоединения я уже смотрел, какие-то даже менял. Но результата не дало :-) Галочки это дело такое, вариантов проставления галочек слишком много. Если у галочки две позиции, а галочек N штук то вариантов расстановок галочек 2 в степени N - много!!! А если серьёзно, то не увидел я там галочек, которые мне могли бы помочь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2006, 14:35 |
|
||
|
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
|
|||
|---|---|---|---|
|
#18+
Проставлением "галочки" в настройках ODBC соединения добился, что поле воспринимается как BLOB (TBlobField). Но ошибка "invalid byte sequence for encoding UTF8" осталась при вызове метода Post. Как может быть связано BLOB поле и кодировка UTF8? Opilki_Inside Запись "в 8-ричной" кодировке тоже не получилась. При записи последовательности вида '\137\057\059\212' возникает та же ошибка про UTF8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2006, 17:23 |
|
||
|
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
|
|||
|---|---|---|---|
|
#18+
Пишем в TADOQuery что-то по типу: Код: plaintext 1. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2006, 19:55 |
|
||
|
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
|
|||
|---|---|---|---|
|
#18+
С практической точки зрения пока вопрос решился. То есть, удалось записывать и читать бинарные данные. Решение оказалось в использовании версии 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)" могу подтвердить, что всё действительно работает :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2006, 22:21 |
|
||
|
Доступ к двоичным данным в PostgreSQL через ODBC на Delphi
|
|||
|---|---|---|---|
|
#18+
vvvolfС практической точки зрения пока вопрос решился. То есть, удалось записывать и читать бинарные данные. Andrey Daeron Спасибо за ответ! По поводу версии ODBC "PostgreSQL ANSI (8.1.2.0)" могу подтвердить, что всё действительно работает :-) Хм. Я с другими драйверами и не работал-то :) . Впрочем, если есть проблемы именно с параметрами - я думаю без проблем можно пообщатся с разработчиками этого драйвера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2006, 12:43 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=33789656&tid=2006301]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 367ms |

| 0 / 0 |
