FAQ VCL
Компоненты\FireDac\FDQuery

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как избавиться от указателя мыши в виде песочных часов при выполнении SQL-запроса?

// Способ первый
type
  TForm1 = class(TForm)
    FDQuery: TFDQuery;
    FDGUIxWaitCursor1: TFDGUIxWaitCursor;
  {...}
  end;

implementation

procedure TForm1.Button1Click(Sender: TObject);
var
  StoredCursor: TFDGUIxScreenCursor;
begin
   StoredCursor := FDGUIxWaitCursor1.ScreenCursor;
   FDGUIxWaitCursor1.ScreenCursor := gcrNone;
   try
      // access DB with queries
   finally
      FDGUIxWaitCursor1.ScreenCursor := StoredCursor;
   end;
end;

// Способ второй
procedure TForm1.Button1Click(Sender: TObject);
begin
   FDQuery1.ResourceOptions.SilentMode := True;
   try
      // access DB with queries
   finally
      FDQuery1.ResourceOptions.SilentMode := False;
   end;
end;

// Способ третий
uses
  {...,} FireDAC.UI.Intf;

procedure TForm1.FormCreate(Sender: TObject);
begin
   // Глобальная настройка
   FFDGUIxSilentMode := True;
end;

// Способ четвертый
type
  TForm1 = class(TForm)
    FDManager1: TFDManager;
    procedure FormCreate(Sender: TObject);
  {...}
  end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
   FDManager1.SilentMode := True;
end;


Как заставить FDQuery показывать количество всех записей, а не загруженных?

procedure TForm1.Button1Click(Sender: TObject);
begin
   FDQuery1.FetchOptions.RecordCountMode := cmTotal;
   FDQuery1.Open;
end;


Как загрузить файл в БД ORACLE используя внутренний поток (ссылку на BLOB, получаемую через параметр)?

// Тестовый пример:
// Схема: REPORT_SRV
// Пакет: PKG_TASK
// Процедура:
// PROCEDURE TEST_TASK(PAR_TASK_ID IN NUMBER, PAR_RESULT_DATA OUT BLOB) IS
// BEGIN
//   INSERT INTO TBL_TASK
//     (ID, RESULT_DATA)
//   VALUES
//     (PAR_TASK_ID, EMPTY_BLOB())
//   RETURNING RESULT_DATA INTO PAR_RESULT_DATA;
// END;

// Способ первый
procedure TForm1.Button1Click(Sender: TObject);
var
  s: TFileStream;
begin
  s := TFileStream.Create('test.bin', fmOpenRead);
  try
    FDConnection1.StartTransaction;
    try
      FDQuery1.SQL.Text := 'begin REPORT_SRV.PKG_TASK.TEST_TASK(:PAR_TASK_ID, :PAR_RESULT_DATA); end;';

      FDQuery1.ParamByName('PAR_TASK_ID').DataType := ftFMTBcd;
      FDQuery1.ParamByName('PAR_TASK_ID').ParamType := ptInput;
      FDQuery1.ParamByName('PAR_TASK_ID').AsFMTBCD := 18216377;

      FDQuery1.ParamByName('PAR_RESULT_DATA').DataType := ftStream;
      FDQuery1.ParamByName('PAR_RESULT_DATA').ParamType := ptOutput;
      FDQuery1.ParamByName('PAR_RESULT_DATA').StreamMode := smOpenRead;

      FDQuery1.ExecSQL;
      FDQuery1.ParamByName('PAR_RESULT_DATA').AsStream.CopyFrom(s, s.Size);
      FDConnection1.Commit;
    except
      FDConnection1.Rollback;
      raise;
    end;
  finally
    s.Free;
  end;
end;

// Способ второй
procedure TForm1.Button1Click(Sender: TObject);
var
  oStr: TFileStream;
begin
  FDConnection1.StartTransaction;
  try
    FDQuery1.SQL.Text := 'begin REPORT_SRV.PKG_TASK.TEST_TASK(:PAR_TASK_ID, :PAR_RESULT_DATA); end;';

    FDQuery1.ParamByName('PAR_TASK_ID').DataType := ftFMTBcd;
    FDQuery1.ParamByName('PAR_TASK_ID').ParamType := ptInput;
    FDQuery1.ParamByName('PAR_TASK_ID').AsFMTBCD := 18216377;

    FDQuery1.ParamByName('PAR_RESULT_DATA').DataType := ftStream;
    FDQuery1.ParamByName('PAR_RESULT_DATA').StreamMode := smOpenWrite;

    FDQuery1.ExecSQL;

    oStr := TFileStream.Create('test.bin', fmOpenRead);
    try
      {$IFDEF AUTOREFCOUNT}
      oInt := FDQuery.Params[0].AsStream;
      oInt.CopyFrom(oStr, -1);
      oInt := nil;
      {$ELSE}
      FDQuery1.ParamByName('PAR_RESULT_DATA').AsStream.CopyFrom(oStr, -1);
      {$ENDIF}
    finally
      oStr.Free;
    end;
    FDQuery1.CloseStreams;
    FDConnection1.Commit;
  except
    FDConnection1.Rollback;
    raise;
  end;
end;

При использовании материала - ссылка на сайт обязательна