DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: kevin20240329
今日帖子: 45
在线用户: 21
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 sun2016 (sun) ▲▲▲△△ -
普通会员
2017/3/2 15:53:51
标题:
请问:同一个FDQuery1执行多个操作,会不会有问题? 浏览:1828
加入我的收藏
楼主: 如下,肯定是不行的;

FDQuery1.close;
FDQuery1.sql.text:=‘select * from tb’;
FDQuery1.open;

for i:=0 to FDQuery.count do
 begin
  
  FDQuery1.close;
  FDQuery1.sql.text:=‘update tb set age=12 where id=’+FDQuery1['ID'];
  FDQuery1.exesql;

 end; 

请问,

1:如果加上事务,是否就可以呢? 
FCon1.StartTransaction;
。。。
FCon1.Commit;


2:是否多个sql操作,必须多个不同的 FDQuery 才可以呢?
----------------------------------------------
学Delphi不久,会问些初级问题,希望有人指引,不胜感激...
作者:
男 142857 (142857) ★☆☆☆☆ -
禁用账号
2017/3/2 16:11:08
1楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
发布广告,禁用帐号!
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2017/3/3 0:28:03
2楼: 这种是很常用的事务处理,当然可以。
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 xaxingyun (千叶) ★☆☆☆☆ -
普通会员
2017/3/3 0:32:11
3楼: 明显不可以
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/3/3 9:11:36
4楼: 2 楼是来搞笑的吗?
或者 2 楼是 楼主的马甲?

其实,楼主才是来搞笑的吧。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 qiuyan81 (苦恋树) ★☆☆☆☆ -
普通会员
2017/3/3 9:32:30
5楼: 非线程安全组件,所以同时操作同个组件是不行的.
你可以这样,多个线程用多个connection,这样是允许的.
----------------------------------------------
作者:
男 zyp1984 (小李他妈的飞刀) ★☆☆☆☆ -
普通会员
2017/3/3 9:54:26
6楼: 不可以的应该....最好用两个组件...
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/3/3 10:02:41
7楼: 我已经无语了。
都不看楼主的代码,就瞎评论。虽然答案都是 不行。
但是为何不行,居然可以乱说。
假设 FDQuery1 是一个 碗。
当你装了 米饭之后。
你循环 取出碗里的米粒。
取出之后,倒出碗里的东西,然后放入面条。
然后继续循环?

你 线程 事务 还是其他什么东西,能解决 上面的问题?

所以 1 3 6 楼 才是正解。

同时证明,和我有仇的,智商都不咋地。聪明的人 都不会 得罪我。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 zhangshelly (雪莱) ★☆☆☆☆ -
盒子活跃会员
2017/3/3 10:16:55
8楼: @wang_80919 这么初浅的问题,你也花时间回复,看来你真的挺空的
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/3/3 10:29:06
9楼: 我本来不想回复的,只想吐槽。
但是,为了防止被人说:光说不练。或者说:只吐槽,不回复。
所以就给一个例子吧。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 qiuyan81 (苦恋树) ★☆☆☆☆ -
普通会员
2017/3/3 10:43:24
10楼: 你才不看题,没看到楼主说他已经知道代码是不行了,他问同时操作多个SQL...什么叫同时?按照你的理解就是鼠标狂点Button就是同时了?
我的理解同时就是多个线程并行操作.
----------------------------------------------
作者:
男 capelin (多春鱼) ★☆☆☆☆ -
盒子活跃会员
2017/3/4 16:02:13
11楼: 在循环体内的语句没有返回数据的操作,为什么不直接就使用fcon.exesql?
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/3/4 16:37:52
12楼: 某人说线程可以。
我也认为线程可以。
但是 楼主的代码,在线程里,一样不行。
11 楼是新的正解。

按 1 6 11 楼的正解,楼主的意图不用线程,也能解决。

某人拿不出正解,就只会狡辩。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2017/3/4 23:51:31
13楼: 楼主的问题没提到什么线程。wang_80919 (Flying Wang)王八兄为什么要自己脑补呢。

同一个Query多次执行不同的SQL当然是可以的。

如果是放到线程中那当另说。
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/3/5 15:24:15
14楼: 13 楼 眼瞎,看不见 5 楼吗?
人家脑补,关老子屁事。

到目前为止依然是 1 3 6 11 楼上正解。
老子的发言,只是吐槽,所以不是正解。

同时再次证明,和我有仇的,智商都不咋地。聪明的人 都不会 得罪我。

因为人家聪明,不和我一般见识,没必要得罪我。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 chscheese (chscheese) ★☆☆☆☆ -
盒子活跃会员
2017/3/5 16:24:30
15楼: FDQuery1执行多个操作理论上是可以的。
但是,具体的数据库事物处理是有限制的,按楼主的代码是不行的。
----------------------------------------------
-
作者:
男 wj7927 (元素) ★☆☆☆☆ -
盒子活跃会员
2017/3/6 12:25:53
16楼: 两种方式,
一是用两个FDQuery,一个用于循环,一个用于执行
FDQuery.close;
FDQuery.sql.text:=‘select * from tb’;
FDQuery.open;
while not FDQuery.Eof do
begin  
  FDQuery1.close;
  FDQuery1.sql.text:=‘update tb set age=12 where id=’+FDQuery['ID'];
  FDQuery1.exesql;
  FDQuery.Next;
end; 

二是用一个FDQuery,一个FDMemTable
FDQuery.close;
FDQuery.sql.text:=‘select * from tb’;
FDQuery.open;
FDMemTable.Data:=FDQuery.Data;
while not FDMemTable.Eof do
begin  
  FDQuery.close;
  FDQuery.sql.text:=‘update tb set age=12 where id=’+FDMemTable['ID'];
  FDQuery.exesql;
  FDMemTable.Next;
end;
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS