-
Как хранить файлы в PostrgeSQL?
Я знаю, что есть такое поле в БД Postgres типа bytea. В TADODataSet-е ему асоциируется поле типа TVarBytesField. Как через него записывать файл в БД и считывать,я не знаю. Как ни пытался у меня не получается.
Может вообще нужно использовать другое поле.Есть мысль использовать поле в БД типа text, а под него в TADODataSet-е ему асоциируется поле типа TStringField.Конвертировать любой файл в строку записывать в поле, а выгружать его в файл с именем хранимое в другом поле.Но как конвертировать тогда файл в строку тоже не знаю.Вобще конечно хотелось бы использовать первый вариант.
-
блобстрим/адоблобстрим + лоадфромфайл
-
А подробней можно?
-
Подробней в справке.
-
я же говорю , там не блоб поле!!!!
-
и что?
-
в mssql на заборе тоже написано что поле varbinary.
а на самом деле это блоб.
-
А у него TVarBytesField значит Value
-
> PG81 © (16.10.09 08:53) [4]
>
> я же говорю , там не блоб поле!!!!
dbExpress говорит, что блоб, сомневаюсь, что в ado они его по-другому интерпретируют.
-
> Плохиш (16.10.2009 11:22:08) [8]
ADO более широк, чем dbExpress и автор подтвердил, что интерпритируется не как ftBlob
-
ну а что делать дальше?В наборе данных сам создаю поле типа TBlobField, и выдается ошибка, типа не тот тип поля, ожидается такой а там другой.Что делать?Самому написать тип поля, только что там в нем делать, вновом типе?
-
> Anatoly Podgoretsky © (16.10.09 11:24) [9]
>
> > Плохиш (16.10.2009 11:22:08) [8]
>
> ADO более широк, чем dbExpress и автор подтвердил, что интерпритируется
> не как ftBlob
BDS2006, TADODataSet - Add all fields добавилось поле TBLOBField.
Т.ч. не знаю, что и у кого как определяется.
-
var
BlobStream: TStream;
FileStream: TStream;
begin
ZQueryBlob.SQL.Clear;
ZQueryBlob.SQL.Text:= 'select data from ' + DBTableBlob + ' where tid=' + Tid;
ZQueryBlob.Open;
BlobStream:= ZQueryBlob.CreateBlobStream(ZQueryBlob.FieldByName('data'), bmRead);
FileStream:= TFileStream.Create('c:\test', fmCreate);
FileStream.CopyFrom(BlobStream, BlobStream.Size);
FileStream.Free;
BlobStream.Free;
ZQueryBlob.Close;
end;
-
Это чтение
-
В БД нужно использовать тип поля bytea
-
А вот с записью, я признаться сам не разобрался. Поэтому использую преобразование бинарного файла в строку вида
"\004\024\000\000\000\010\033\000\000\361\000\000\010\000\034"
которую и передаю непосредсвенно в запросе инсерт :)
-
А с какого боку ZeosLIB к ADO?
-
Я сталкнулся с такой же проблемой, записать в базу данных у меня получилось, а вот считать уже неделю мучаюсь не как не выходит, я для конекта использую ODBCDRIVER (8.4)
тест добовления файла
procedure TAdmin.AddReq();
const
UPDATE_CRTFILE = 'Update crt'
+ ' Set req_st=:req_st, req_file=:req_file, req_filename=:req_filename'
+ ' Where signature=:signature';
var
Err: string;
fs: TStream;
begin
Err := '';
VegaDll(Err);
if Err = '' then
begin
try
fs := TFileStream.Create(ExtractFilePath(Application.ExeName) + 'Req\' + gOnlineKey + '.req', fmOpenRead); //получение путя и имени файла
TAdoLib.CreateLocalDS(gOnLine.Cnn, cmdUpdateCrt, UPDATE_CRTFILE, cmdText); // здесь у меня весит постоянный конект к базе
cmdUpdateCrt.Parameters.ParseSQL(UPDATE_CRTFILE, true);
cmdUpdateCrt.Parameters.ParamByName('req_st').Value := 'have';
cmdUpdateCrt.Parameters.ParamByName('req_file').LoadFromStream(fs, ftBytes);// запись в базу данных из параметра
cmdUpdateCrt.Parameters.ParamByName('req_filename').Value := gOnlineKey + '.req';
cmdUpdateCrt.Parameters.ParamByName('signature').Value := gOnlineKey;
cmdUpdateCrt.Execute;
finally
fs.Free
end;
end;
end;
Чтение пробовал разными способами не как не могу сделать...
-
Во наконец получилось проблема была в настройках строки подключения через ODBCDRIVER (8.4)
в строке подключения поменял один параметр
ByteaAsLongVarBinary=0;' на ByteaAsLongVarBinary=1;'
и вытянул через строковую переменную
try
FilName := cdsCrtAll.FieldByName('sk_filename').AsString;//получение имени
st := cdsTests.Fields.FieldByName('sk_file').AsString;//получение данных в строку
cn := Length(st);//размер строки
FStr := TFileStream.Create(gOnLineDirInIkey + FilName, fmCreate);//создание фалового потока
FStr.Write(st[1], cn);//запись данных в файл
finally
FStr.Free;
end;