读书人

用MDI窗口ADO多线程查询报错解决方法

发布时间: 2012-11-10 10:48:51 作者: rapoo

用MDI窗口ADO多线程查询报错
网上看了个ADO线程的帖子
然后把他加入到MDI窗口中来用
子窗口查询后,关闭时跳出这个错误:
system Error code:1400 无效的窗口句柄
control '' has no parent window
如果再建立新窗口会跳出
A component named form1 already exists
然后无法建立

整个MDI关掉后,报这样的错误
exception einvalidpointer in module project1.exe at 00003d39 invalid pointer operation



单元代码是

Delphi(Pascal) code
unit Mdatabas;interfaceuses  Classes, ADODB,activex;type  TDatabaseThread = class(TThread)  private    FADODataSet:TADODataSet;    FADOQuery:TADOQuery;    FADOCommand:TADOCommand;    SQLString:string;    protected procedure Execute; override;  public    constructor Create(ADO:TADODataSet;S:String); overload;    constructor Create(ADO:TADOQuery;S:String); overload;    constructor Create(ADO:TADOCommand;S:String); overload;    destructor destroy;  end;implementationuses Unit1;{ TDatabaseThread }constructor TDatabaseThread.Create(ADO:TADODataSet;S:String);begin  FADODataSet:=ADO;  SQLString:=S;  inherited Create(False);end;constructor TDatabaseThread.Create(ADO:TADOQuery;S:String);begin  FADOQuery:=ADO;  SQLString:=S;  inherited Create(False);end;constructor TDatabaseThread.Create(ADO:TADOCommand;S:String);begin  FADOCommand:=ADO;  SQLString:=S;  inherited Create(False);end;destructor tDatabaseThread.destroy;begin   FADODataSet.Free;   FADOQuery.Free;   FADOCommand.Free;   couninitialize;end;procedure TDatabaseThread.Execute;begin  FreeOnTerminate:=True;  coinitialize(nil);  if FADODataSet<>nil then  begin    FADODataSet.Close;    FADODataSet.CommandType:=cmdText;    FADODataSet.CommandText:=SQLString;    FADODataSet.Open;  end;  if FADOQuery<>nil then  begin    FADOQuery.Close;    FADOQuery.SQL.Clear;    FADOQuery.SQL.Add(SQLString);    FADOQuery.ExecSQL;  end;  if FADOCommand<>nil then  begin    FADOCommand.CommandText:=SQLString;    FADOCommand.Execute;  end;  couninitialize;  if Terminated then exit;end;end.



子窗口运行时调用语句直接是:
mdatabas.tdatabasethread.create(ADODataset1,'select * from a');



请问这如何解决
像MDI子窗口,如何实现ADO的多线程查询


[解决办法]
断点 跟踪 抓取特定值 Watch List...
[解决办法]
是俺眼花了,耐着性子看了半天,除了查询,没有看到传说中的MDICHILD窗体的影子啊……

看你的错误提示,应该是findcontrol(hwnd)的时候,提示是无效的句柄。
而findcomponet('form1')又能找到该窗体~~是不是screen的问题?
[解决办法]
基本上每种数据库都有自己的查询机制,DELPHI只是把查询指令发送过去,具体查询还是由数据库本身实现的,所以说用线程来实现数据库查询没太大实际意义。

貌似couninitialize;重复执行了,去掉一个试试……
[解决办法]
ADO组件是COM组件,需要包含在特定套件之中。Create时是在主线程的套件之中,不能够拿到子线程中使用。建议直接在子线程中创建,也就是在Excute中创建ADO组件然后执行相关方法。如需数据显示,请使用中间变量进行同步到主线程处理。

读书人网 >.NET

热点推荐