对于一个查询的问题,如果一数据集或存储过程查询的数据量大,因此用到了线程,
这样会显得不会死机,用户也可以中断它的查询。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分
这样会显得不会死机,用户也可以中断它的查询。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分
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货