DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jeff1314
今日帖子: 9
在线用户: 3
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 phper2000 (phper2000) ▲▲▲▲△ -
普通会员
2017/5/11 14:21:04
标题:
FireDAC 多线程添加正常、但查询数据报错 浏览:1770
加入我的收藏
楼主: Delphi Berlin
两种数据库,SQLLite和PostgreSQL

多线程添加数据时,一切正常;

多线程查询数据时,就报各种莫名其妙的错误,一会报“游标”不存在,一会报“xxx”字段不存在(事实上是存在的),竟然还有这个“Cannot open / define command, which does not return result sets. Hint: use Excecute / ExecSQL method for non-SELECT commands.”。

贴出查询的语句:



function TForm1.GetTheQueryData(const aSQL: String; aQuery: TFDQuery): Boolean;
begin
  Result := False;
//  EnterCriticalSection(_CSDB);
  try
    try
      if Assigned(aQuery) then
      begin
        aQuery.Connection := FDConnection1;
        aQuery.SQL.Clear;
        aQuery.SQL.Add(aSQL);
        aQuery.Open();
        Result := True;
      end;
    except
      on E: Exception do
        //
    end;
  finally
//    LeaveCriticalSection(_CSDB);
  end;
end;



SQL: 当然是查询语句,就不贴具体的了。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/5/11 14:33:47
1楼: 你 不怕 aQuery 正在忙吗?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 phper2000 (phper2000) ▲▲▲▲△ -
普通会员
2017/5/11 17:48:10
2楼: 【 Every thread needs to create its own database connection.】
估计是这个原因,回头测试结果发出来
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/5/11 17:49:43
3楼: 为什么用英文来表达,给谁看?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 pp0123 (pp0123) ★☆☆☆☆ -
普通会员
2017/5/11 18:00:37
4楼: 看这 http://stackoverflow.com/questions/2449183/using-entercriticalsection-in-thread-to-update-vcl-label
----------------------------------------------
-
作者:
男 phper2000 (phper2000) ▲▲▲▲△ -
普通会员
2017/5/11 18:04:14
5楼: 已测试通过,就是上述这个原因!
----------------------------------------------
-
作者:
男 ma9888 (majx) ★☆☆☆☆ -
盒子活跃会员
2018/3/18 9:10:22
6楼: phper2000,您好!
   数据库多线程存取困扰我好有了,不知怎么实现,能不能你把FireDAC 多线程作个使用总结或把你的FireDAC 多线程代码发给我学习学习呢?非常感谢您!我的QQ:613354940
----------------------------------------------
-
作者:
男 liang1zhou (Mark zql) ★☆☆☆☆ -
普通会员
2018/3/18 9:25:14
7楼: fdac 多线程可以考虑用自带的连接池来搞,多线程安全
----------------------------------------------
-
作者:
男 nickemma (N.E Zhou) ★☆☆☆☆ -
普通会员
2018/3/19 0:05:28
8楼: 1楼猫哥已经非常明确的告诉你问题所在了。

你说多线程添加数据正常,也许你的aQuery是采用EXECSQL方式提交,并非数据集方式add,所以线程提交后,aQuery就空闲了。但查询表格,看了下你的GetTheQueryData代码,aQuery是open状态,比如你两个线程使用,第一个线程已近把aQuery Open了,第二线程又来了,aQuery还在占用,所以肯定出错。

你可以变通做,加个FDMEMTABLE内存表,用来释放aQuery的占用,代码大概意思如下,手机码子,写的不好不要介意,只算表达意思:

query.open
fdmemtable.data:=query.data
query.close
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行68.35938毫秒 RSS