Конференция "Базы" » Как хранить файлы в PostrgeSQL? [D7, PostgreSQL]
 
  • PG81 © (15.10.09 15:58) [0]
    Как хранить файлы в PostrgeSQL?
    Я знаю, что есть такое поле в БД Postgres типа bytea. В TADODataSet-е ему асоциируется поле типа TVarBytesField. Как через него записывать файл в БД и считывать,я не знаю. Как ни пытался у меня не получается.
    Может вообще нужно использовать другое поле.Есть мысль использовать поле в БД типа text, а под него в TADODataSet-е ему асоциируется поле типа TStringField.Конвертировать любой файл в строку записывать в поле, а выгружать его в файл с именем хранимое в другом поле.Но как конвертировать тогда файл в строку тоже не знаю.Вобще конечно хотелось бы использовать первый вариант.
  • Медвежонок Пятачок © (15.10.09 16:18) [1]
    блобстрим/адоблобстрим + лоадфромфайл
  • PG81 © (15.10.09 17:23) [2]
    А подробней можно?
  • Плохиш © (15.10.09 21:16) [3]
    Подробней в справке.
  • PG81 © (16.10.09 08:53) [4]
    я же говорю , там не блоб поле!!!!
  • Медвежонок Пятачок © (16.10.09 09:27) [5]
    и что?
  • Медвежонок Пятачок © (16.10.09 09:29) [6]
    в mssql на заборе тоже написано что поле varbinary.
    а на самом деле это блоб.
  • Anatoly Podgoretsky © (16.10.09 11:15) [7]
    А у него TVarBytesField значит Value
  • Плохиш © (16.10.09 11:22) [8]

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

    dbExpress говорит, что блоб, сомневаюсь, что в ado они его по-другому интерпретируют.
  • Anatoly Podgoretsky © (16.10.09 11:24) [9]
    > Плохиш  (16.10.2009 11:22:08)  [8]

    ADO более широк, чем dbExpress и автор подтвердил, что интерпритируется не как ftBlob
  • PG81 © (16.10.09 11:31) [10]
    ну а что делать дальше?В наборе данных сам создаю поле типа TBlobField, и выдается ошибка, типа не тот тип поля, ожидается такой а там другой.Что делать?Самому написать тип поля, только что там в нем делать,  вновом типе?
  • Плохиш © (17.10.09 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 (26.10.09 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 (26.10.09 16:10) [13]
    Это чтение
  • Vitalts (26.10.09 16:17) [14]
    В БД нужно использовать тип поля bytea
  • Vitalts (26.10.09 16:21) [15]
    А вот с записью, я признаться сам не разобрался. Поэтому использую преобразование бинарного файла в строку вида
    "\004\024\000\000\000\010\033\000\000\361\000\000\010\000\034"
    которую и передаю непосредсвенно в запросе инсерт :)
  • Виталий Панасенко (27.10.09 17:58) [16]
    А с какого боку ZeosLIB к ADO?
  • Sky_Dream (25.11.09 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 (25.11.09 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;
 
Конференция "Базы" » Как хранить файлы в PostrgeSQL? [D7, PostgreSQL]
Есть новые Нет новых   [134435   +33][b:0][p:0]