Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.15;
Скачать: CL | DM;

Вниз

Как хранить файлы в PostrgeSQL?   Найти похожие ветки 

 
PG81 ©   (2009-10-15 15:58) [0]

Как хранить файлы в PostrgeSQL?
Я знаю, что есть такое поле в БД Postgres типа bytea. В TADODataSet-е ему асоциируется поле типа TVarBytesField. Как через него записывать файл в БД и считывать,я не знаю. Как ни пытался у меня не получается.
Может вообще нужно использовать другое поле.Есть мысль использовать поле в БД типа text, а под него в TADODataSet-е ему асоциируется поле типа TStringField.Конвертировать любой файл в строку записывать в поле, а выгружать его в файл с именем хранимое в другом поле.Но как конвертировать тогда файл в строку тоже не знаю.Вобще конечно хотелось бы использовать первый вариант.


 
Медвежонок Пятачок ©   (2009-10-15 16:18) [1]

блобстрим/адоблобстрим + лоадфромфайл


 
PG81 ©   (2009-10-15 17:23) [2]

А подробней можно?


 
Плохиш ©   (2009-10-15 21:16) [3]

Подробней в справке.


 
PG81 ©   (2009-10-16 08:53) [4]

я же говорю , там не блоб поле!!!!


 
Медвежонок Пятачок ©   (2009-10-16 09:27) [5]

и что?


 
Медвежонок Пятачок ©   (2009-10-16 09:29) [6]

в mssql на заборе тоже написано что поле varbinary.
а на самом деле это блоб.


 
Anatoly Podgoretsky ©   (2009-10-16 11:15) [7]

А у него TVarBytesField значит Value


 
Плохиш ©   (2009-10-16 11:22) [8]


> PG81 ©   (16.10.09 08:53) [4]
>
> я же говорю , там не блоб поле!!!!

dbExpress говорит, что блоб, сомневаюсь, что в ado они его по-другому интерпретируют.


 
Anatoly Podgoretsky ©   (2009-10-16 11:24) [9]

> Плохиш  (16.10.2009 11:22:08)  [8]

ADO более широк, чем dbExpress и автор подтвердил, что интерпритируется не как ftBlob


 
PG81 ©   (2009-10-16 11:31) [10]

ну а что делать дальше?В наборе данных сам создаю поле типа TBlobField, и выдается ошибка, типа не тот тип поля, ожидается такой а там другой.Что делать?Самому написать тип поля, только что там в нем делать,  вновом типе?


 
Плохиш ©   (2009-10-17 16:35) [11]


> Anatoly Podgoretsky ©   (16.10.09 11:24) [9]
>
> > Плохиш  (16.10.2009 11:22:08)  [8]
>
> ADO более широк, чем dbExpress и автор подтвердил, что интерпритируется
> не как ftBlob

BDS2006, TADODataSet - Add all fields добавилось поле TBLOBField.
Т.ч. не знаю, что и у кого как определяется.


 
Vitalts   (2009-10-26 16:09) [12]

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;


 
Vitalts   (2009-10-26 16:10) [13]

Это чтение


 
Vitalts   (2009-10-26 16:17) [14]

В БД нужно использовать тип поля bytea


 
Vitalts   (2009-10-26 16:21) [15]

А вот с записью, я признаться сам не разобрался. Поэтому использую преобразование бинарного файла в строку вида
"\004\024\000\000\000\010\033\000\000\361\000\000\010\000\034"
которую и передаю непосредсвенно в запросе инсерт :)


 
Виталий Панасенко   (2009-10-27 17:58) [16]

А с какого боку ZeosLIB к ADO?


 
Sky_Dream   (2009-11-25 18:59) [17]

Я сталкнулся с такой же проблемой, записать в базу данных у меня получилось, а вот считать уже неделю мучаюсь не как не выходит, я для конекта использую 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;

Чтение пробовал разными способами не как не могу сделать...


 
Sky_Dream   (2009-11-25 19:21) [18]

Во наконец получилось проблема была в настройках строки подключения через 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;



Страницы: 1 вся ветка

Текущий архив: 2011.05.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.006 c
2-1296925416
UnnamedUser
2011-02-05 20:03
2011.05.15
Размер файла на сервере


2-1296928775
new_user
2011-02-05 20:59
2011.05.15
TWebBrowser


2-1296731036
student22
2011-02-03 14:03
2011.05.15
WebSnap


15-1296130623
Knight
2011-01-27 15:17
2011.05.15
Права доступа и тормоза в 1с...


6-1237214179
FireMan_Alexey
2009-03-16 17:36
2011.05.15
Вопрос про метод CONNECT в HTTP протоколе