初衷是想在执行SQL查询的过程中,让用户可以点击“终止”而放弃查询。在网上搜了一些代码,自己修改一下做测试,结果不行。以下是我的测试代码:TForm1上三个按钮:
Button11,用于建立新线程,并指向执行SQL查询的函数;
Button22,用于启动SQL——点这就出现异常错误;
Button33,用于终止查询——还没试到这一步。//---------线程入口函数
function MyThreadFun(p: Pointer): Integer; stdcall;
var
  quy:TADOQuery;
begin
  with TADOQuery.Create(application) do
  begin
    Connection:=ADOConnection1;//ADOConnection1是进入系统时的公用连接.
    close;
    SQL.Clear;
    SQL.add('exec PRC_TEST');
//服务器端过程 PRC_TEST 的主要内容就一句:WAITFOR DELAY '02:00'
    Open;
  end;  Result := 0;
end;//---------建立并挂起线程
procedure TForm1.Button11Click(Sender: TObject);
var   ID: DWORD;
begin
  hThread := CreateThread(nil, 0, @MyThreadFun, nil, CREATE_SUSPENDED, ID);
  //Button1.Enabled := False;
end;//---------唤醒并继续线程,启动查询
procedure TForm1.Button22Click(Sender: TObject);
begin
  ResumeThread(hThread);
end;//---------取消SQL查询
procedure TForm1.Button33Click(Sender: TObject);
begin
  ADOConnection1.Cancel;;
end;烦请各位给予指导,谢谢!

解决方案 »

  1.   

      CoInitialize(nil);
      try
        ......
      finally
       CoUninitialize;
      end;
    在线程中用ADO连接需要加入上面的语句。
      

  2.   

    ADOConnection1.Cancel;
    这个,就是用来终止过程执行的,应该可以的。
      

  3.   


    谢谢你的回答。
    按你说的,我这样,错误依旧:
    function MyThreadFun(p: Pointer): Integer; stdcall;
    begin
      try
        Coinitialize(nil);
      with TADOQuery.Create(application) do
      begin
        Connection:=ADOConnection1;
        close;
        SQL.Clear;
        SQL.add('exec PRC0300');
        Open;
      end;
      finally
        CoUninitialize;
      end;
    end;
      

  4.   

    你这样用可能有问题,你要执行一个储存过程,下面又用OPEN,可能出错。建议你先将SQL语句改成:
    SQL.Add('select * from t1');//找一个记录数少的表,看是否出错。 
      

  5.   

    ADOConnection1.Cancel; 只是说这个查询结果我不要了,查询还是会在服务器上进行吧
    你用CreateThreadchuan创建线程必须把全局变量IsMultiThread设置为true,或者用BeginThread来创建线程,
    当然最好是继承TThread来做。