Форум: "Базы";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
ВнизADO [eoAsyncExecute] при выполнении хранимых процедур Найти похожие ветки
← →
Санёк (2004-12-03 18:14) [0]Нужно иметь возможность прерывать выполнение хранимой процедуры с клиента, для этого выполняю процедуру в ассинхронном режиме:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB;
type
TForm1 = class(TForm)
ADOConnection: TADOConnection;
ADODataSet: TADODataSet;
DataSource: TDataSource;
DBGrid: TDBGrid;
ButtonStart: TButton;
ButtonStop: TButton;
Memo: TMemo;
procedure ButtonStartClick(Sender: TObject);
procedure ADOConnectionExecuteComplete(Connection: TADOConnection;
RecordsAffected: Integer; const Error: Error;
var EventStatus: TEventStatus; const Command: _Command;
const Recordset: _Recordset);
procedure ADOConnectionWillExecute(Connection: TADOConnection;
var CommandText: WideString; var CursorType: TCursorType;
var LockType: TADOLockType; var CommandType: TCommandType;
var ExecuteOptions: TExecuteOptions; var EventStatus: TEventStatus;
const Command: _Command; const Recordset: _Recordset);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ButtonStartClick(Sender: TObject);
begin
ADODataSet.CommandText := Memo.Text;
ADODataSet.ExecuteOptions := [eoAsyncExecute]; // (1)
ADODataSet.Open;
end;
procedure TForm1.ADOConnectionExecuteComplete(Connection: TADOConnection;
RecordsAffected: Integer; const Error: Error;
var EventStatus: TEventStatus; const Command: _Command;
const Recordset: _Recordset);
begin
ADODataSet.EnableControls;
end;
procedure TForm1.ADOConnectionWillExecute(Connection: TADOConnection;
var CommandText: WideString; var CursorType: TCursorType;
var LockType: TADOLockType; var CommandType: TCommandType;
var ExecuteOptions: TExecuteOptions; var EventStatus: TEventStatus;
const Command: _Command; const Recordset: _Recordset);
begin
ADODataSet.DisableControls;
end;
end.
Но она не возращает записи, если убираю (1) то всё нормально. Подскажите как правильно использовать [eoAsyncExecute]???
← →
tERRORist © (2004-12-03 18:19) [1]Если в ХП есть несколько SQL-конструкций, а не просто один SELECT то надо все до этого поледнего селекта заключить в
set nocount on
...
set nocount off
← →
Санёк (2004-12-03 18:22) [2]Нет, у меня один select...
← →
tERRORist © (2004-12-03 18:24) [3]Еще можно попробовать добавить eoAsyncFetch,eoAsyncFetchNonBlocking и делать EnableControls по событию OnFetchComplete датасета
← →
sniknik © (2004-12-03 19:54) [4]> Подскажите как правильно использовать [eoAsyncExecute]???
получать рекордсет в событии onExecuteComplete (заметь там рекордсет в параметрах, вот он тебе и нужен)
а сразу после ADODataSet.Open; с этим параметром рекордсет так и должен быть пустым, т.к. ты же ему сам этим параметром говориш - выполнять (вернее получать данные) асинхронно, в паралельном потоке...
EnableControls/DisableControls в этом случае довольно бессмысленны...
если только такprocedure TForm1.ADOConnectionExecuteComplete(Connection: TADOConnection;
RecordsAffected: Integer; const Error: Error;
var EventStatus: TEventStatus; const Command: _Command;
const Recordset: _Recordset);
begin
ADODataSet.DisableControls;
ADODataSet.Recordset:= Recordset;
ADODataSet.EnableControls;
end;
← →
Санёк (2004-12-06 09:24) [5]2 sniknik:
>ADODataSet.Recordset:= Recordset;
При данной операции выводиться ошибка : Recordeset is not open
Может еще нужно что то сделать???
← →
tERRORist © (2004-12-06 09:50) [6]Проверяй
if Error = nil then ADODataSet.Recordset := Recordset;
else
ADODataSet.Recordset := nil;
← →
tERRORist © (2004-12-06 09:58) [7]Я щас компоненту допишу ADOAsyncDataSet, могу послать на мыло потестить.
← →
Санёк (2004-12-06 09:59) [8]:) Буду очень благодарен.
← →
Санёк (2004-12-06 10:05) [9]чуть не забыл... Tualan@yandex.ru плз...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c