Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PosgreSQL, BLOB (bytea и Large Objects). Чудеса. / 5 сообщений из 5, страница 1 из 1
22.03.2007, 17:14
    #34409480
NetFantom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PosgreSQL, BLOB (bytea и Large Objects). Чудеса.
Поднимая старую тему =)
Итак, напомню, при работе с BLOB столкнулся со следующей проблемой - при записи данных 1,5 Мб никаких проблем, при попытке работы с файло в 5Мб получаю ошибку.
Пробовались следующие комбинации:
Соединение
- ODBС->ADO
- PostgresDAC
Тип поля в базе данных:
- BYTEA
- OID (Large Objects)
Вставка методом:
- INSERT INTO, передача BLOB поля через параметр используя LoadFromFile
- INSERT, POST методы (для T*Query или T*Table), передача BLOB поля через поле и LoadFromFile

Размер файла - 5Мб.


Все попытки работы через ADO - неудача.

Работа через PostgresDAC
Если тип поля BYTEA то оба метода вставки вылетают с ошибкой
"PostgreSQL Error Code(1): ошибка получения данных с сервера : Software caused connection abort"

Если тип поля OID то при использовании INSERT INTO и параметров получается та же ошибка что выше, а вот если использовать методы INSERT,POST, то О ЧУДО! Все работает!

Таким образом, единстенный способ вставить данный большого объема получается только при использовании типа поля OID и кода вроде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   
with TPSQLQuery.Create(nil) do
  try
    Database := PSQLDatabase1;
    RequestLive := true;
    SQL.Add('select id,data from test');
    Open;
    Insert;
    TBLOBField(FieldByName('data')).LoadFromFile('c:\tmp\file.exe');
    Post;
  finally
    Free;
  end;
...
Рейтинг: 0 / 0
22.03.2007, 19:16
    #34409845
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PosgreSQL, BLOB (bytea и Large Objects). Чудеса.
NetFantom
Итак, напомню, при работе с BLOB столкнулся со следующей проблемой - при записи данных 1,5 Мб никаких проблем, при попытке работы с файло в 5Мб получаю ошибку.
Пробовались следующие комбинации:
Соединение
- ODBС->ADO

У меня в этом случае все работает нормально (запись в bytea).
...
Рейтинг: 0 / 0
23.03.2007, 00:49
    #34410200
NetFantom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PosgreSQL, BLOB (bytea и Large Objects). Чудеса.
А какие версии ты используешь?
У меня PostgreSQL 8.2, все настройки и конфигурации - по умолчанию.
ODBC драйвер - PostgreSQL Unicode 8.02.02.00
Delphi (2006) 10.06 Update 2
...
Рейтинг: 0 / 0
27.03.2007, 12:45
    #34417993
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PosgreSQL, BLOB (bytea и Large Objects). Чудеса.
NetFantomА какие версии ты используешь?
У меня PostgreSQL 8.2, все настройки и конфигурации - по умолчанию.
ODBC драйвер - PostgreSQL Unicode 8.02.02.00
Delphi (2006) 10.06 Update 2
В 8.2 еще не пробовал, а в 8.1 с тогдашним ODBC драйвером - было дело. Экзешка 6-7 метров атлично валялась в БД.
Из компонент - TBetterADODataSet.
Код примерно такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  sql_str:='DELETE FROM ma_file_update WHERE name='''+fname+''';';
  dmMain.adcWP.CommandText:=sql_str+
    'INSERT INTO ma_file_update (version, name, file, readyforupdate) VALUES ('''+str+''','''+fname+''',:file,0)';
  dmMain.adcWP.Parameters.ParamByName('file').DataType:=ftBlob;    
  dmMain.adcWP.Parameters.ParamByName('file').Value:=s;    
//    'INSERT INTO ma_file_update (version, name, file, readyforupdate) VALUES ('''+str+''','''+fname+''','+dmMain.PgConvert(s)+',0)';
  dmMain.adcWP.Execute;
Раньше использовал закоменченую строчку, где функция PgConvert - это злостно-асмо-самописный конвертер в 8-ричную систему строки.
...
Рейтинг: 0 / 0
03.04.2007, 10:40
    #34433184
Spion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PosgreSQL, BLOB (bytea и Large Objects). Чудеса.
а можно еще проще, просто скопировать файл где есть права пользователя под которым запущен сервер и вызвать спец функции

There are server-side functions callable from SQL that correspond to each of the client-side functions described above; indeed, for the most part the client-side functions are simply interfaces to the equivalent server-side functions. The ones that are actually useful to call via SQL commands are lo_creat, lo_create, lo_unlink, lo_import, and lo_export. Here are examples of their use:

CREATE TABLE image (
name text,
raster oid
);

SELECT lo_creat(-1); -- returns OID of new, empty large object

SELECT lo_create(43213); -- attempts to create large object with OID 43213

SELECT lo_unlink(173454); -- deletes large object with OID 173454

INSERT INTO image (name, raster)
VALUES ('beautiful image', lo_import('/etc/motd'));

SELECT lo_export(image.raster, '/tmp/motd') FROM image
WHERE name = 'beautiful image';

The server-side lo_import and lo_export functions behave considerably differently from their client-side analogs. These two functions read and write files in the server's file system, using the permissions of the database's owning user. Therefore, their use is restricted to superusers. In contrast, the client-side import and export functions read and write files in the client's file system, using the permissions of the client program. The client-side functions can be used by any PostgreSQL user.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PosgreSQL, BLOB (bytea и Large Objects). Чудеса. / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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