在线程中创建Query,当循环使用其查询到第三次时,跳出cpu窗口及出错信息 (100分)

  • 主题发起人 美国提子
  • 开始时间

美国提子

Unregistered / Unconfirmed
GUEST, unregistred user!
QueryPool := TQuery.Create(nil);
QueryPool.DatabaseName := FDatabaseName;
QueryDev := TQuery.Create(nil);
QueryDev.DatabaseName := FDatabaseName;
with QueryPooldo
begin
Sql.Add('select * from Pool');
Sql.Add('where (PoolState = 1) and (PoolType <> ''1'')');
Open;
while not Eofdo
begin
with QueryDevdo
begin
Close;
//当地三次循环这里时,提示出错,下面语句sql语句也一样出错
//如果Synchronize(Close)就不会出错
//但Synchronize(Sql.Clear)根本就没有清除Sql,
//Synchronize(Open)也查不出任何记录
Sql.Clear;
Sql.Add('select * from PoolDevice');
Sql.Add('where PoolID = '+QueryPool.FieldByName('PoolID').AsString);
Open;
end;

end;
出错现象:跳出cpu窗口计出错信息:
Project Hymms.exe faulted with message: 'access violation at 0x4da2ed3d: read of address
0xfff6d6ec'. Process Stopped. Use Step or Run to continue
用Synchronize(过程名)
过程中进行with Query操作,根本就不会执行这个过程
 
动态生成的控件,用完后你把他Free掉试试
 
呵呵,循环完2次后,释放再创建是不会出错的
Free;
QueryDev := TQuery.Create(nil);
QueryDev.DatabaseName := FDatabaseName;

我现在要知道为什么会出错,而且有没有更好的办法
 
1.慎重使用with语句嵌套,很容易出错。
2.看看用没用了什么第三方控件,很多bug是它们造成的。
 
呵呵,没用第三方控件
with语句嵌套是比较容易出错,呵呵,不过我的问题应该不是这个原因,加了以下语句就不出错了
Free;
QueryDev := TQuery.Create(nil);
QueryDev.DatabaseName := FDatabaseName;
当循环完2次后执行以上语句,释放再创建是不会出错的
 
FDatabaseName是那里创建的?
我还是建议你把里面那层with语句去掉,hehe
 
FDatabaseName是线程private中的一个String变量,线程创建时存放传进来的Database的DatabaseName
 
最好每个线程自己用一个TDatabase,至少要一个Session,保证
每个线程对应一个数据库连接.
 
Session是做什么的,呵呵,如果综合我上面的语句应该使用Session的那些操作,刚才看了一下论坛的Session问题,不怎么懂
 
用BDE没用过Session,怪事
 
呵呵,是怪阿,开始不出错的,后来不知怎么得出了一次错,每次编译就都错了,呵呵,我还以为是我Delphi的缘故,结果靠到其他机子上,还是外甥点灯笼-照旧
 
而且Session的AutoSessionName属性最好设为True;
 
如果用Session室不是要多个Database多个Session阿
 
如果是那样最好,Database和Session都可以放在线程中。
 
呵呵,我的只能有一个database
 
多人接受答案了。
 
顶部