zeos + postgres загрузка blob

Judo
Дата: 18.05.2011 17:13:02
нашел такой кусок кода
procedure TfrmMain.btnLoadImageClick(Sender: TObject);
var
  BlobStream: TStream;
  FileStream: TStream;
begin
  if Dataset.Active then begin
    dlgOpenFile.Filter := 'Bitmap files (*.bmp)|*.BMP';
    if dlgOpenFile.Execute then begin
      begin
        if Dataset.State <> dsEdit then
          Dataset.Edit;

        BlobStream := Dataset.CreateBlobStream(
        Dataset.FieldByName(edtBlobColumn.Text), bmWrite);
        try
          FileStream := TFileStream.Create(dlgOpenFile.FileName, fmOpenRead);
          try
            BlobStream.CopyFrom(FileStream, FileStream.Size);
          finally
            FileStream.Free;
          end;
        finally
          BlobStream.Free;
        end;

        Dataset.Post;
      end;
    end;
  end;  
end;

Здесь датасет преводится в режим редактирования (Dataset.Edit;).
Как сделать другими компонентами zeos, не используя это датасет (просто он всегда в ReadOnly режиме - на него навязан DBGrid) ?
Т.е. как к примеру Update'ом и например ZQuery(или другим компонентом zeos) обновить поле строки с ID=36345 - трудность в объекте BlobStream,
т.е я же не смогу записать:
ZQuery.....:='update mytab set colblob='+BlobStream......+' where ID='+....
размер файла может быть большим....
Johnmen
Дата: 18.05.2011 17:25:19
Про параметрический запрос что-нибудь слышали?
Judo
Дата: 18.05.2011 17:45:36
Johnmen
Про параметрический запрос что-нибудь слышали?


слышал :-) но на стороне сервера , сам сервер заменит его значением параметра и потом выполнит DML, только вот инструкция на этот момент будет некорректной
Johnmen
Дата: 18.05.2011 17:50:18
Judo,

Какая "инструкция"? На какой "момент"? Почему?
Judo
Дата: 18.05.2011 18:05:43
Johnmen
Judo,

Какая "инструкция"? На какой "момент"? Почему?


для update сервер подставляет конкретное значение параметра, которое в нашем случае есть blob.....
Начинающий SQL 2008
Дата: 18.05.2011 18:48:24
Judo, а postgres позволяет update`ить по кускам, как в MS SQL ?
Если да, то вот кусок из работающего проекта. Здесь заливка происходит в асинхронном режиме и никакого TimeOut`a не будет.
+ Работает довольно шустро, максимальный размер файла = 2Гб
 kusok := 8040 shl 5; // Из BOL MS SQL: в целях увеличения производительности рекомендуется вставлять или обновлять данные фрагментами, кратными 8040 байтам.

 fs := TFileStream.Create(MyFile, fmOpenRead or fmShareDenyWrite);
 fsize := fs.Size;

 if fsize mod kusok = 0 then // Редкий случай, но кто знает...
  kol_vo := fsize div kusok
 else // наиболее распрастраненный случай
  kol_vo := Trunc(fsize / kusok) + 1;


 ProgressBar1.Max := kol_vo;
 ADOCommand1.ExecuteOptions := ADOCommand1.ExecuteOptions + [eoAsyncExecute];

 try
  for i := 1 to kol_vo do
  begin
   ms := TMemoryStream.Create();

   try
    if fsize - fs.Position < kusok then kusok := fsize - fs.Position;
    ms.CopyFrom(fs, kusok);
    ADOCommand1.CommandText := 'update Blobs set BigBlob .write (:bin, NULL, 0) where BlobID = ident_current(''Docs'')';
    ADOCommand1.Parameters[0].LoadFromStream(ms, ftBlob);
    ADOCommand1.Execute;

    while stExecuting in ADOCommand1.States do
    begin
     if flag_cancel then exit;
     Application.ProcessMessages;
     Sleep(2);
    end;

    ProgressBar1.StepIt;
   finally
    ms.Free;
   end;
  end; // for i := 1 to kol_vo

 finally
  fs.Free;
  if flag_cancel then PostMessage(Self.Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
 end;

З.Ы. Дал ответ на ваш предыдущий пост 10673269 Должен отработать и на postgres ...
Judo
Дата: 19.05.2011 09:20:38
Начинающий SQL 2008
Judo, а postgres позволяет update`ить по кускам, как в MS SQL ?
Если да, то вот кусок из работающего проекта. Здесь заливка происходит в асинхронном режиме и никакого TimeOut`a не будет.

таймаут? какой таймаут?

Начинающий SQL 2008
ADOCommand1.CommandText := 'update Blobs set BigBlob .write (:bin, NULL, 0) where BlobID = ident_current(''Docs'')';


собственно интересует реализация "set BigBlob .write (:bin, NULL, 0)" но только для постгреса....
Начинающий SQL 2008
Дата: 19.05.2011 10:53:49
Judo
таймаут? какой таймаут?
Если команда выполняется долго (обычно > 30 сек.), то часто возникает ошибка соединения.
Здесь
или
Здесь


Judo
собственно интересует реализация "set BigBlob .write (:bin, NULL, 0)" но только для постгреса....
Лучше спросить здесь
http://www.sql.ru/forum/actualtopics.aspx?bid=7