2014-09-26 43 views

回答

5

您可能会在ExecuteOptions中使用[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.