有关线程的高级问题!!! 可能不光要定义Query还要定义Session. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对windindance(风之舞):我在其他的程序中动态生成Query=Tquery.create(form1)能实现多线程对数据库的同时访问 我想既然你用到了线程,那么你就要用到session! qTmp := TADOQuery.Create(Form1); //要是一个容器 unit TQueryThread_Unit;interfaceuses Classes,dbtables,db,Dialogs,Sysutils,DBGrids;type TSQLModelType = (stSelect,stExecute,stProcSelect); TQueryThread = class(TThread) private { Private declarations } FQuery : TQuery; FSession : TSession; FDataBase : TDataBase; FDataSource : TDataSource; WarningMessage :String; procedure SetDBGrid; procedure ShowWarning; protected procedure Execute; override; public SQLText : String; SQLModel : TSQLModelType ; DBGrid : TDBGrid; constructor Create(AOwner:TComponent); destructor Destroy;override; end;implementationconstructor TQueryThread.Create(AOwner:TComponent);begin{一个Database只能让一个线程执行查询,所以要自己Create一个Session,一个DataBase,一个Query,和一个DataSource,DataSource也是须的,要不然在DBGrid指针的移动时候会等待直到SQL查询完毕。如果有DataSource就不用等。线程会慢慢把数据放入DataSource,然后在DBGrid上显示出来。} FSession := TSession.Create(AOwner) ; FSession.AutoSessionName := true ; FSession.KeepConnections := true ; FSession.Open; FDataBase := TDatabase.Create(AOwner) ; FDataBase.SessionName := FSession.SessionName ; FDataBase.DatabaseName := 'DB_'+FSession.SessionName ; FDataBase.DriverName := 'MSSQL' ; {使用MS SQL Server作为后台数据库} FDataBase.LoginPrompt := False ; FDataBase.Params.Add('DATABASE NAME=test') ;{使用 SQL Server上的Test库} FDataBase.Params.Add('USER NAME=sa') ; FDataBase.Params.Add('PASSWORD=') ; FDataBase.Params.Add('SERVER NAME=dep') ;{这里请改为自己的服务器名字} FQuery := TQuery.Create(AOwner) ; FQuery.SessionName := FSession.SessionName ; FQuery.DatabaseName := FDataBase.DatabaseName ; FDataSource := TDataSource.Create( AOwner ); FDataSource.DataSet := FQuery ; FreeOnTerminate := False ; WarningMessage := '' ; SQLModel := stSelect ; inherited Create( True );end;destructor TQueryThread.Destroy;begin FSession.Close;//一定要先CloseFSession,然后才Free,要不然会等待直到SQL查询完毕。 FSession.Free; FQuery.Free; FDataBase.Free; FDataSource.Free;end;procedure TQueryThread.SetDBGrid;Begin DBGrid.DataSource := FDataSource ;end;procedure TQueryThread.ShowWarning;Begin MessageDlg( WarningMessage , mtWarning , [mbOK] ,0 );end;procedure TQueryThread.Execute;Var i : integer;begintry if SQLText = '' then begin WarningMessage := '没有指定SQL查询语句.'; Synchronize( ShowWarning ); end else if (DBGrid = nil) then begin WarningMessage := '没有指定DBGrid.'; Synchronize( ShowWarning ); end else begin FQuery.Close; FQuery.SQL.Text := SQLText ; case SQLModel of stSelect ,stProcSelect: Begin FQuery.Open; Synchronize( SetDBGrid ); End; stExecute: Begin FQuery.ExecSQL; End; end; end;except on E:EDBEngineError do Begin WarningMessage := '数据库运行出错。' + #13 + '错误代码:' ; for i:= 0 to E.ErrorCount -1 do WarningMessage := WarningMessage + #13+ IntToStr( E.Errors[i].ErrorCode ) +': ' + E.Errors[i].Message; Synchronize( ShowWarning ); End else raise;end;end;end.使用的时候,先Create(费话!) ,这里Create给的是当前的form,然后指定SQL语句,SQL工作模式,还有显示SQL查询结果的DBGrid。 QueryThread := TQueryThread.Create (Self); QueryThread.DBGrid := DBGrid_Show ; QueryThread.SQLText :=Memo_SQL.Text ; QueryThread.SQLModel := SQLModel ; (指定SQL执行的模式) QueryThread.Resume ;关闲查询就先Suspend再Free,不这样做会出错。 QueryThread.Suspend; QueryThread.Free; SPComm控件在发送十六进制数11的时候会丢失??高手指点啊 制作出的driver.sys使用直接蓝屏。。。 【请教】access中的随机数(随机记录)问题 求助:收取邮件时碰到的一个问题,请朋友们帮忙看一看 哪里有D3下载? 学习西医 如何把TClientSocket 置于堵塞模度 如何暂停窗口的刷新?特别是菜单和工具条(包括OLE控件激活时融入的菜单和工具条) 数组形参的传递问题 有两张内容比较相似的单据,但是实际情况是他们确实是不同的东西,我做设计时是做成一个对象,还是设计成两个对象??? 打印问题,关于QRDBText,QRMemo 50分 如何控制工具栏中的按钮
我在其他的程序中动态生成Query=Tquery.create(form1)能实现多线程对数据库的同时访问
我想既然你用到了线程,那么你就要用到session!
qTmp := TADOQuery.Create(Form1); //要是一个容器
Classes,dbtables,db,Dialogs,Sysutils,DBGrids;type
TSQLModelType = (stSelect,stExecute,stProcSelect); TQueryThread = class(TThread)
private
{ Private declarations }
FQuery : TQuery;
FSession : TSession;
FDataBase : TDataBase;
FDataSource : TDataSource;
WarningMessage :String;
procedure SetDBGrid;
procedure ShowWarning;
protected
procedure Execute; override;
public
SQLText : String;
SQLModel : TSQLModelType ;
DBGrid : TDBGrid;
constructor Create(AOwner:TComponent);
destructor Destroy;override;
end;implementationconstructor TQueryThread.Create(AOwner:TComponent);
begin
{一个Database只能让一个线程执行查询,所以要自己Create一个Session,一个DataBase,一个Query,和一个DataSource,DataSource也是须的,要不然在DBGrid指针的移动时候会等待直到SQL查询完毕。如果有DataSource就不用等。线程会慢慢把数据放入DataSource,然后在DBGrid上显示出来。}
FSession := TSession.Create(AOwner) ;
FSession.AutoSessionName := true ;
FSession.KeepConnections := true ;
FSession.Open; FDataBase := TDatabase.Create(AOwner) ;
FDataBase.SessionName := FSession.SessionName ;
FDataBase.DatabaseName := 'DB_'+FSession.SessionName ;
FDataBase.DriverName := 'MSSQL' ; {使用MS SQL Server作为后台数据库}
FDataBase.LoginPrompt := False ;
FDataBase.Params.Add('DATABASE NAME=test') ;{使用 SQL Server上的Test库}
FDataBase.Params.Add('USER NAME=sa') ;
FDataBase.Params.Add('PASSWORD=') ;
FDataBase.Params.Add('SERVER NAME=dep') ;{这里请改为自己的服务器名字} FQuery := TQuery.Create(AOwner) ;
FQuery.SessionName := FSession.SessionName ;
FQuery.DatabaseName := FDataBase.DatabaseName ; FDataSource := TDataSource.Create( AOwner );
FDataSource.DataSet := FQuery ; FreeOnTerminate := False ;
WarningMessage := '' ;
SQLModel := stSelect ;
inherited Create( True );
end;destructor TQueryThread.Destroy;
begin
FSession.Close;
//一定要先CloseFSession,然后才Free,要不然会等待直到SQL查询完毕。
FSession.Free;
FQuery.Free;
FDataBase.Free;
FDataSource.Free;
end;procedure TQueryThread.SetDBGrid;
Begin
DBGrid.DataSource := FDataSource ;
end;procedure TQueryThread.ShowWarning;
Begin
MessageDlg( WarningMessage , mtWarning , [mbOK] ,0 );
end;procedure TQueryThread.Execute;
Var
i : integer;
begin
try
if SQLText = '' then
begin
WarningMessage := '没有指定SQL查询语句.';
Synchronize( ShowWarning );
end
else if (DBGrid = nil) then
begin
WarningMessage := '没有指定DBGrid.';
Synchronize( ShowWarning );
end
else
begin
FQuery.Close;
FQuery.SQL.Text := SQLText ;
case SQLModel of
stSelect ,stProcSelect:
Begin
FQuery.Open;
Synchronize( SetDBGrid );
End;
stExecute: Begin
FQuery.ExecSQL;
End;
end;
end;
except
on E:EDBEngineError do
Begin
WarningMessage := '数据库运行出错。' + #13 + '错误代码:' ;
for i:= 0 to E.ErrorCount -1 do
WarningMessage := WarningMessage + #13+ IntToStr( E.Errors[i].ErrorCode ) +': ' + E.Errors[i].Message;
Synchronize( ShowWarning );
End
else
raise;
end;
end;end.使用的时候,先Create(费话!) ,这里Create给的是当前的form,然后指定SQL语句,SQL工作模式,还有显示SQL查询结果的DBGrid。 QueryThread := TQueryThread.Create (Self);
QueryThread.DBGrid := DBGrid_Show ;
QueryThread.SQLText :=Memo_SQL.Text ;
QueryThread.SQLModel := SQLModel ; (指定SQL执行的模式)
QueryThread.Resume ;关闲查询就先Suspend再Free,不这样做会出错。
QueryThread.Suspend;
QueryThread.Free;