Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO [eoAsyncExecute] при выполнении хранимых процедур [D7, MSSQL]


Санёк ©   (2004-12-03 18:14:00) 

Нужно иметь возможность прерывать выполнение хранимой процедуры с клиента, для этого выполняю процедуру в ассинхронном режиме:

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]???


Санёк   (2004-12-06 10:05:00) [1]

чуть не забыл... Tualan@yandex.ruплз...


Санёк   (2004-12-06 09:59:00) [2]

:) Буду очень благодарен.


tERRORist   (2004-12-06 09:58:00) [3]

Я щас компоненту допишу ADOAsyncDataSet, могу послать на мыло потестить.


tERRORist   (2004-12-06 09:50:00) [4]

Проверяй
if Error = nil then  ADODataSet.Recordset := Recordset;
else
ADODataSet.Recordset := nil;


Санёк   (2004-12-06 09:24:00) [5]

2 sniknik:
> ADODataSet.Recordset:= Recordset;
 При данной операции выводиться ошибка : Recordeset is not open
Может еще нужно что то сделать???


sniknik   (2004-12-03 19:54:00) [6]

> Подскажите как правильно использовать [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;


tERRORist   (2004-12-03 18:24:00) [7]

Еще можно попробовать добавить eoAsyncFetch,eoAsyncFetchNonBlocking и делать EnableControls по событию OnFetchComplete датасета


Санёк   (2004-12-03 18:22:00) [8]

Нет, у меня один select...


tERRORist   (2004-12-03 18:19:00) [9]

Если в ХП есть несколько SQL-конструкций, а не просто один SELECT то надо все до этого поледнего селекта заключить в

set nocount on
...
set nocount off


Наверх

Титульная страница Поиск, карта сайта Написать письмо