对于一个查询的问题,如果一数据集或存储过程查询的数据量大,因此用到了线程,
这样会显得不会死机,用户也可以中断它的查询。Kill线程的时候(中断),报了一个"在
异步运行时,操作不能被执行",且服务端的数据库线程也没有终断,小弟以为的数据库查询的线程没有终断,也将数据库中的线程杀死了,但是还是报那个错。下面为程序代码
  ThreadsForSeek = class(TThread)
  private
    sp : TADODataSet ;
  protected
    procedure Execute; override;
  public
    succ : boolean ;
    Constructor create(mysp : TADODataSet);
  end;  TFrmProgress = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Animate1: TAnimate;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private 
    procedure finishSeek(Sender : TObject);
  public
    sp : TADODataSet ;
    mySeek : ThreadsForSeek ;
    myStart : Cardinal ;
  end;
  procedure KillProgress(sender:tobject);
implementation
uses cdm;
{$R *.dfm}procedure KillProgress(sender:tobject);
var
   adoDtemp:Tadodataset;
   adoctemp:TadoCommand;
   dbid:String; //得取数据库的id号
   progressid :String; //得取数据库进程的id号
   computername:pchar; //得取机器的名字
   size:cardinal;
Begin
     try
         size := sizeof(computername);
         new(computername);
         GetComputerName(computername,size);
         adoDtemp := Tadodataset.Create(nil);
         adoDtemp.Connection := DMMain.ADOCon;
         adoDtemp.CommandText := 'SELECT dbid FROM master..sysdatabases where name = ' + quotedstr('dbwomen');
         adoDtemp.Prepared := true;
         adoDtemp.Open;
         dbid := adoDtemp.fieldbyname('dbid').AsString; //得取数据库的id号
         adoDtemp.Close;
         adoDtemp.CommandText := 'select spid FROM master..sysprocesses where hostname = ' +
                                quotedstr(trim(computername)) + ' and dbid = ' + quotedstr(trim(dbid)) +
                                ' and status = ' + quotedstr('runnable');
        adoDtemp.Prepared := true;
        adoDtemp.Open;
        progressid := adoDtemp.fieldbyname('spid').AsString; //得取数据库进程的id号
        adoDtemp.Close;
        //开始杀进程
        adoctemp := TadoCommand.Create(nil);
        adoctemp.Connection := DMMain.ADOCon;
        adoctemp.CommandText := 'exec(' +quotedstr('kill ' + trim(progressid)) + ' )';
        adoctemp.Prepared := true;
        adoctemp.Execute;
    finally
        adoDtemp.Free;
        adoctemp.Free;
        dispose(computername);
    end;
End;procedure TFrmProgress.FormCreate(Sender: TObject);begin
  self.Timer1.Enabled := true;
  self.Animate1.Active := true;
  myStart := 0;
end;procedure TFrmProgress.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  self.Timer1.Enabled := false;
  self.Animate1.Active := false;
end;procedure TFrmProgress.finishSeek(Sender: TObject);
begin
  if myseek.succ then
    ModalResult := mrok
  else
    ModalResult := mrcancel;
end;//杀死进程
procedure TFrmProgress.Button1Click(Sender: TObject);
begin
    try
       TerminateThread(myseek.Handle,0);  
       ModalResult := mrcancel;
    except
       ;
   end;    
end;
{ ThreadsExamples }
constructor ThreadsForSeek.create(mysp: TADODataSet);
begin
  inherited create(false);
  sp := mysp;
  FreeOnTerminate:=True;
  succ := false;
end;procedure ThreadsForSeek.Execute;
var
   s:tadodataset;
begin
  sp.Prepared := true;
  s := Tadodataset.Create(application);
  try
    s.Connection  := sp.Connection;
    s.CommandText := sp.CommandText;
    s.Active := true ;
    if s.Active = false then
       begin
           succ := false ;
           exit;
       end;
    sp.Clone(s);
    succ := true ;
  except
    s.Close;
    s.Free;
    succ := false ;
  end;
  s.Close;
  s.Free;
end;
procedure TFrmProgress.FormShow(Sender: TObject);
begin
  myseek :=  ThreadsForSeek.create(sp);
  myseek.OnTerminate := finishSeek;
end;procedure TFrmProgress.Timer1Timer(Sender: TObject);
begin
  mystart := mystart + 1;
  label2.Caption := '已进行:'+inttostr(myStart)+'秒';
end;
end.解块后再送900分