DELPHI XE3 ADO查询使我的应用程序在等待数据时冻结

DELPHI XE3 ADO查询使我的应用程序在等待数据时冻结,delphi,ado,Delphi,Ado,是否有任何解决方案,以免在等待数据来自数据库时冻结我的UI 例如: 我们有一个ADO查询,我们有 adoquery.active:=false; adoquery.active:=true 当adoquery试图从db获取数据时,UI中的所有内容都被冻结,如果用户单击,则整个程序都会被冻结 没有回应 是否有解决此问题的方法?您可以在执行选项中使用[eoAsyncExecute,eoAsyncFetch],这将要求数据集使用显式TAdoConnection。 为了避免意外行为,您必须在打开数据集之

是否有任何解决方案,以免在等待数据来自数据库时冻结我的UI

例如:

我们有一个ADO查询,我们有

adoquery.active:=false; adoquery.active:=true

当adoquery试图从db获取数据时,UI中的所有内容都被冻结,如果用户单击,则整个程序都会被冻结 没有回应


是否有解决此问题的方法?

您可以在
执行选项中使用
[eoAsyncExecute,eoAsyncFetch]
,这将要求数据集使用显式TAdoConnection。
为了避免意外行为,您必须在打开数据集之前使用
DisableControls
,在
FetchComplete
之后使用
EnableControls

FetchComplete
中名为
EnableControls
的直接控件可能会导致异常,因此需要将Postmessage与用户定义的消息一起使用

  Const
  // define a message for handling completed AsyncFetch after leaving FetchComplete
  WM_MYConnect=WM_User + 77;

type

  TMyForm = class(TForm)
    MyDataSet: TADODataSet;
    MyDatasource: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    ADOConnection1: TADOConnection;
    procedure Button1Click(Sender: TObject);
    procedure MyDataSetFetchComplete(DataSet: TCustomADODataSet; const Error: Error; var EventStatus: TEventStatus);
  private
    { Private-Deklarationen }
    Procedure ConnectDatasource(var MSG:TMessage); message WM_MYConnect;
  public
    { Public-Deklarationen }
  end;

var
  MyForm: TMyForm;

implementation

{$R *.dfm}

procedure TMyForm.Button1Click(Sender: TObject);
begin
 MyDataset.Close;
 // example blocking command for SQL-Server 10 seconds
 MyDataset.CommandText := 'WAITFOR DELAY ''00:00:10'' Select* from  aa';
 Mydataset.DisableControls;
 Mydataset.ExecuteOptions := [eoAsyncExecute,eoAsyncFetch];
 MyDataset.Open;
end;

procedure TMyForm.ConnectDatasource(var MSG:TMessage);
begin
   TAdodataset(MSG.WParam).EnableControls;
//   MyDataSource.DataSet := MyDataset;
end;

procedure TMyForm.MyDataSetFetchComplete(DataSet: TCustomADODataSet; const Error: Error; var EventStatus: TEventStatus);
begin
  // if we want to add a datasource we will have to ensure that it will happen after leaving FetchComplete
  // so we call our procedure ConnectDatasource via PostMessage
  PostMessage(Handle,WM_MYConnect,wParam(DataSet),0);
end;

end.

您可以在
执行选项中使用
[eoAsyncExecute,eoAsyncFetch]
,这将要求数据集使用显式TAdoConnection。
为了避免意外行为,您必须在打开数据集之前使用
DisableControls
,在
FetchComplete
之后使用
EnableControls

FetchComplete
中名为
EnableControls
的直接控件可能会导致异常,因此需要将Postmessage与用户定义的消息一起使用

  Const
  // define a message for handling completed AsyncFetch after leaving FetchComplete
  WM_MYConnect=WM_User + 77;

type

  TMyForm = class(TForm)
    MyDataSet: TADODataSet;
    MyDatasource: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    ADOConnection1: TADOConnection;
    procedure Button1Click(Sender: TObject);
    procedure MyDataSetFetchComplete(DataSet: TCustomADODataSet; const Error: Error; var EventStatus: TEventStatus);
  private
    { Private-Deklarationen }
    Procedure ConnectDatasource(var MSG:TMessage); message WM_MYConnect;
  public
    { Public-Deklarationen }
  end;

var
  MyForm: TMyForm;

implementation

{$R *.dfm}

procedure TMyForm.Button1Click(Sender: TObject);
begin
 MyDataset.Close;
 // example blocking command for SQL-Server 10 seconds
 MyDataset.CommandText := 'WAITFOR DELAY ''00:00:10'' Select* from  aa';
 Mydataset.DisableControls;
 Mydataset.ExecuteOptions := [eoAsyncExecute,eoAsyncFetch];
 MyDataset.Open;
end;

procedure TMyForm.ConnectDatasource(var MSG:TMessage);
begin
   TAdodataset(MSG.WParam).EnableControls;
//   MyDataSource.DataSet := MyDataset;
end;

procedure TMyForm.MyDataSetFetchComplete(DataSet: TCustomADODataSet; const Error: Error; var EventStatus: TEventStatus);
begin
  // if we want to add a datasource we will have to ensure that it will happen after leaving FetchComplete
  // so we call our procedure ConnectDatasource via PostMessage
  PostMessage(Handle,WM_MYConnect,wParam(DataSet),0);
end;

end.