如何正确获取写入的数量?

秋天之落叶 2020-01-16 11:57:42
FDBatchMoveSQLReader1.ReadSQL := 'select ... ';
FDBatchMoveSQLWriter1.WriteSQL := 'update ... ';
FDBatchMoveSQLWriter1.TableName := 计算表';
FDBatchMove1.GuessFormat();
n := FDBatchMove1.Execute;

由于受条件限制,读出的数据和写入的数据不一致,比如读出10条写入8条。
我几乎试过所有的和FDBatchMove1.XxxxCount、FDBatchMoveSQLWriter1.BatchMove.XxxxCount等等有关的方法,全部都是读出的数据10,或是0。
我用那个方法可以获取写入的数据8呢?
...全文
661 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 15 楼 秋天之落叶 的回复:
[quote=引用 14 楼 早打大打打核战争 的回复:]
不是bug,写入数量本来就不一定等于读出数量,因为受到写模式、唯一键之类的限制

关键是既然可以允许不等,那为什么没有可以判断的函数呢?[/quote]

因为SQL中没有标准方法获取insert、delete、update所影响的记录数量,不同的DBMS可能有不同方法获取,比如MS SQL Server支持output子句获取插入删除更新的记录数量,参考这个帖子:https://forums.asp.net/t/2106556.aspx?Counting+how+many+records+to+update+and+insert+into+SQL+Server+table+
秋天之落叶 2020-02-05
  • 打赏
  • 举报
回复
还有知道的吗?没有就结贴啦
秋天之落叶 2020-02-05
  • 打赏
  • 举报
回复
引用 14 楼 早打大打打核战争 的回复:
不是bug,写入数量本来就不一定等于读出数量,因为受到写模式、唯一键之类的限制

关键是既然可以允许不等,那为什么没有可以判断的函数呢?
秋天之落叶 2020-02-05
  • 打赏
  • 举报
回复
昨天下了一个爬虫,开始了你好世界的入门学习,
秋天之落叶 2020-02-05
  • 打赏
  • 举报
回复
引用 19 楼 早打大打打核战争 的回复:
新年快乐,小猴子还在奋勇前行吗,辛苦了~~~

在家不让出去,值班时也不让出去,闲的难受,憋得难受,上来看看,也不愿意垒代码了。
  • 打赏
  • 举报
回复
新年快乐,小猴子还在奋勇前行吗,辛苦了~~~

秋天之落叶 2020-02-05
  • 打赏
  • 举报
回复
引用 17 楼 早打大打打核战争 的回复:
[quote=引用 15 楼 秋天之落叶 的回复:]
[quote=引用 14 楼 早打大打打核战争 的回复:]
不是bug,写入数量本来就不一定等于读出数量,因为受到写模式、唯一键之类的限制

关键是既然可以允许不等,那为什么没有可以判断的函数呢?[/quote]

因为SQL中没有标准方法获取insert、delete、update所影响的记录数量,不同的DBMS可能有不同方法获取,比如MS SQL Server支持output子句获取插入删除更新的记录数量,参考这个帖子:https://forums.asp.net/t/2106556.aspx?Counting+how+many+records+to+update+and+insert+into+SQL+Server+table+
[/quote]
原来如此,结贴了。
顺祝新年身体好!
  • 打赏
  • 举报
回复
不是bug,写入数量本来就不一定等于读出数量,因为受到写模式、唯一键之类的限制
秋天之落叶 2020-01-21
  • 打赏
  • 举报
回复
看来用这玩意的人确实少啊,又试了两天,精确计数还是搞不成,没招了,自己写了一个函数:
本地连接1-ado1
远程连接2-ado2
查询,计数1,循环ado1
修改ado2
计数2
结束循环
计数1<>计数2 撤销 else 成立 (这个计量对我的应用判断很重要)
我很奇怪,FDBatchMove怎么就不能准确的计算写入的数据数量?读出的数据量不一定是写入的数据量啊?尤其是其他数据源,本人以为这是一个大大的BUG!


秋天之落叶 2020-01-19
  • 打赏
  • 举报
回复
请问一下用过的兄弟们:
使用dataset时,reader和writer就fdquery只能用select语句吗?writer在什么情况下可以使用update语句?
我试过所有的mode和update赋值,均告失败,找不到reader的赋值变量。
有知道的,请指点一下!
继续加分。
秋天之落叶 2020-01-19
  • 打赏
  • 举报
回复
引用 10 楼 早打大打打核战争 的回复:
三种标准reader/writer:Text、DataSet、SQL可以任意对应

嗯,我已经测试过了,datasetreader+sqlwriter直接读数据写数据,解决了累加问题,但还是没有解决准确读数的问题。
单用DataSet解决不了累计问题(也可能是我不会用),只要使用sqlwriter解决不了准确读取导入数据量的问题。
可以选择预先读出数据,用DataSet导入数据,再累加预读的数据,可是总感觉这样太笨了。
继续研究中
  • 打赏
  • 举报
回复
三种标准reader/writer:Text、DataSet、SQL可以任意对应
  • 打赏
  • 举报
回复
引用 3 楼 秋天之落叶 的回复:
[quote=引用 2 楼 qq_35968014 的回复:]
没像你这样写过

你一般怎么写?[/quote]
这是什么控件?我一般用ADO
秋天之落叶 2020-01-18
  • 打赏
  • 举报
回复
另一个问题:使用FDBatchMovedatasetReader如何累加字段值? FDQuery1.Open('select 序号,数量 from [Stest$] '); with FDBatchMoveDataSetReader1 do begin DataSet := FDQuery1; Optimise := False; end; FDQuery2.Open('select 序号,数量 from Dtest'); with FDBatchMoveDataSetWriter1 do begin DataSet := FDQuery2; Optimise := False; end; FDBatchMove1.Execute; FDQuery2中的数量有数据,把FDQuery1的数量累加到FDQuery2中,如何处理? dminsert然后用update?
秋天之落叶 2020-01-18
  • 打赏
  • 举报
回复
另外,我看到了这样的一个案例 FBatchMove := TFDBatchMove.Create(nil); FBatchMove.Analyze := [taDelimSep, taHeader, taFields]; FReader := TFDBatchMoveDataSetReader.Create(FBatchMove); FWriter := TFDBatchMoveSQLWriter.Create(FBatchMove); FMemTable := TFDMemTable.Create(nil); FMemTable.LoadFromFile('t_Elepo2.bin', sfBinary); FReader.DataSet := FMemTable; FWriter.Connection := con_Test; FWriter.TableName := 't_Elepo_Test2'; // 如果数据集里只有表的部分字段,则需要指定哪些字段。 FWriter.ReadSQL := 'select ElePoID, MLineID, LineLen, Serial from T_ElePo_Test2 where 1 = 0 '; FBatchMove.Mode := dmAlwaysInsert; FBatchMove.Execute; TFDBatchMoveDataSetReader和TFDBatchMoveSQLWriter可以交叉使用吗?难道不是DataSetReader和DataSetWriter?
秋天之落叶 2020-01-18
  • 打赏
  • 举报
回复
引用 3 楼 秋天之落叶 的回复:
这是什么控件?我一般用ADO
是FDBatchMove
秋天之落叶 2020-01-17
  • 打赏
  • 举报
回复
引用 2 楼 qq_35968014 的回复:
没像你这样写过

你一般怎么写?
  • 打赏
  • 举报
回复
没像你这样写过
秋天之落叶 2020-01-17
  • 打赏
  • 举报
回复
mode:=dmalwaysinsert
秋天之落叶 2020-01-17
  • 打赏
  • 举报
回复
引用 4 楼 早打大打打核战争 的回复:
mode:=dmalwaysinsert 这样不会读取10写入8的,除非有唯一键限制了

今天一天没干别的,把mode的几个模式+fdbatchmove.XXXcount+FDBatchMoveSQLReader1.batchmove.XXXcount全试了一遍,另外还把写入的数据表的主键设成唯一关键字短,统统不行,直接晕掉。

最后试了试FDBatchMovedatasetReader反而没有问题了,哈哈。
这delphi+SQL果然不靠谱,还是delphi+BCD老古董靠谱,就像电子技术永远没有机械技术靠谱一样,哈哈哈
加载更多回复(1)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧