unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids;
type
TTest=Class(TThread)
protected
Q_tmp:Tadoquery;
Q_Str:string;
procedure Execute;override;
procedure QProcess;
public
constructor create(TQ:Tadoquery;TQ_Str:string);
end;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
Button1: TButton;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
Constructor TTest.create(TQ:Tadoquery;TQ_Str:string);//&&&&新建
begin
Q_tmp:=TQ;
Q_Str:=TQ_str;
inherited create(false);
end; //&&&&&over
procedure TTest.QProcess; //**********查询开始
begin
with Q_tmp do
begin
close;
sql.Clear;
sql.Add(Q_str);
try
open;
except
execsql;
end;
end;
end; //*************over
procedure TTest.Execute;
begin
FreeonTerminate:=true;
synchronize(QProcess);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TTest.create(adoquery1,'select * from jobs');
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids;
type
TTest=Class(TThread)
protected
Q_tmp:Tadoquery;
Q_Str:string;
procedure Execute;override;
procedure QProcess;
public
constructor create(TQ:Tadoquery;TQ_Str:string);
end;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
Button1: TButton;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
Constructor TTest.create(TQ:Tadoquery;TQ_Str:string);//&&&&新建
begin
Q_tmp:=TQ;
Q_Str:=TQ_str;
inherited create(false);
end; //&&&&&over
procedure TTest.QProcess; //**********查询开始
begin
with Q_tmp do
begin
close;
sql.Clear;
sql.Add(Q_str);
try
open;
except
execsql;
end;
end;
end; //*************over
procedure TTest.Execute;
begin
FreeonTerminate:=true;
synchronize(QProcess);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TTest.create(adoquery1,'select * from jobs');
end;
try
open;
except
execsql; // 哪里有这样的写法呢可以将此句屏蔽掉。。或做其他更有意义的事情
end;
有时用open后,仍然无法打开查询到数据,需要用execsql才行,为什么了,怎么避 免.
老师,太谦虚了,我查过你的底了,乃高手也。
begin
FreeonTerminate:=true;
synchronize(QProcess); //QProcess 是什么东西
end; 如果这个东西 可能会同时被多个线程访问 那么就需要加上 synch..进行同步处理 不然可以不用的。
你是想创建单独的线程去执行不同的SQL语句吧。。
这种数据库程序应该单独创建自己的tadoquery和tadoconnection
执行数据库操作的代码段不需要同步但是如果执行过程中或者结束后要报告给主界面
则往主界面写的代码需要同步