问题-"Record not found or changed by another user"
回答1:===============================================================
问题:clientdataset“Record not found or changed by another user”
unable to find record no key specified
原因:
Clientdataset提交数据时服务器端比对提交数据Delta中的原始数据,如果比对数据不符则报告上述错误,一般发生在插入操作后更新,对于单表发生错误原因如下:
1 数据库有自增长字段.测试发现ADO可以在插入数据后自动刷新自增长字段值,在afterupdaterecord事件中加入下面语句可以在更新后同步刷新clientdataset
if (updatekind=ukinsert) then begin
deltads.FieldByName('id').ReadOnly:=false;
deltads.FieldByName('id').NewValue:=qry1ID.Value;
end;
resolvetodataset必须为true才行.详细说明见流水号产生一文.DbExpress测试发现无法刷新自增长字段,所以建议在数据库中不要随意使用自增长字段,很多人使用自增长字段只是为了做关键字,从数据库设计的原理上看,这样的做法是对簇索引的极大浪费.
2 数据库字段有Default值,但是ADO和DBexpress更新数据后都无法刷新default值,所以解决方法是不用数据库的default值,或客户端添加数据时自动赋值.
3 关键字中有浮点数,日期类(Delphi处理为浮点数)字段,测试发现在Access上面如果使用这些字段,会因为Delphi自身的误差导致无法按照关键字检索到数据,解决方法是用序号或者流水号作为关键字.
4 params造成的数据"消失".很多系统一打开窗口不是查询表所有的数据,而是默认查询当天或者指定查询条件的数据,一般在数据集中设定好Param来配合查询,这时问题就出现了,比如我查询的是当天的业务数据,可以我录入的时候日期是昨天的,在C/S架构中,数据保存后依然在数据集中存在,ado不会因为刷新而使新添加的数据消失.但在midas架构中则有所不同,Clientdataset提交数据后,数据正常插入,Clientdataset中数据也不会因为不满足查询条件而自动消失.但马上提交修改时,privoder接收到修改数据,会自动去关连的ado中查询数据是否存在,此时会出现查询不到数据的情况,报告题目中的错误,我猜测是服务器端没有为客户端保存任何数据和连接,Insert成功后,ado数据集马上被关闭了,下次更新数据时,再根据param打开ado查询,此时就会发生上述错误了.
我的解决方法是Clientdataset.afterapplyupdate中判断更新的数据集是否复核查询条件,如果不满足,则自动扩展查询条件,自动查询一次,这样就不会出现上述错误.
另外,在子母表中,我还没有找到什么方法可以刷新自增长字段和Default字段的方法,因为子表是整个数据集作为一个字段传输的,如果谁有方法和刷新子表字段请通知我一声.
回答2:===============================================================
问题-"Record not found or changed by another user"的更多相关文章
- 比特币_Bitcoin 简介
2008-11 Satoshi Nakamoto Bitcoin: A Peer-to-Peer Electronic Cash System http://p2pbucks.com/?p=99 ...
- RFC-RTSP
Network Working Group H. Schulzrinne Request for Comments: 2326 Columbia U. Category: Standards Trac ...
- Roo中的@Version
首页 关于 Roo中的@Version 发表回复 问题提出 当我们为entity添加@RooJpaActiveRecord注解时,Roo为我们自动生成了一个名为Entity_Roo_Jpa_Entit ...
- 常用sql commands以及mysql问题解决日志
mysql workbench常用命令快捷键 ctrl+T ->创建新的sql query tab ctrl+shift+enter->执行当前的sql命令 https://dev.mys ...
- Bitcoin: A Peer-to-Peer Electronic Cash System
Bitcoin: A Peer-to-Peer Electronic Cash System Satoshi Nakamoto October 31, 2008 Abstract A purely p ...
- Ext grid单元格编辑时获取获取Ext.grid.column.Column
item2.width = 80; //item2.flex = 1; item2.align = 'center'; item2.menuDisabled = true; //禁止显示列头部右侧菜单 ...
- mysql数据库变更监控(canal)
背景: 1. 一些项目的基础功能会有Audit Trace, 以记录系统用户所做过的所有记录. 2. 实时备份数据,比如mysql主从复制,一个用于面向应用,一个用于对应用数据库的实时备份. 3. 实 ...
- RTSP Spectification
Refer: https://www.ietf.org/rfc/rfc2326.txt Network Working Group H. SchulzrinneRequest for Comments ...
- If one session has a shared or exclusive lock on record R in an index, another session cannot insert
If one session has a shared or exclusive lock on record R in an index, another session cannot insert ...
随机推荐
- use worker without js file
var blob = new Blob(['onmessage=function(e){postMessage(e.data);}']); debugger; // Obtain a blob URL ...
- dos下的edit命令使用详解
dos下的edit命令使用详解 来源:网络 作者:未知 edit命令是一个简单的编辑软件,我们经常用它来编辑一些程序和批处理文件. 比如,我想在c盘根目录下编辑一个简单的批处理文件,要求无论当前盘和当 ...
- Hbase 0.96 比 hbase 0.94的改变
转载:http://blog.csdn.net/hxpjava1/article/details/20043703 环境: hadoop:hadoop-2.2.0 hbase:hbase-0.96.0 ...
- 华为机试题——数组排序,且奇数存在奇数位置,偶数存在偶数位置
题目要求很简单,就是给你一个数组,对它进行排序,并且排序后,奇数要放在奇数的位置上,偶数要放在偶数的位置上,如果不满足这个规则的话就在数组上填充0 实现代码如下,文中值得注意的一点就是如何判读这个数字 ...
- opencv 操作本地摄像头实现录像
直接上代码: // demo1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...
- jQuery CSS 添加/删除类名
addClass(class) — 为每个匹配的元素添加指定的类名.参数 : class — 一个或多个要添加到元素中的CSS类名,请用空格分开(String)示例 一 :为匹配的元素加上 'sele ...
- sjtu1333 函数时代
Description Taring说:生活的过程就是执行函数的过程.需要命令,也需要回报.更重要的,是得到回报的过程. 好吧...这道题其实和上面的也没啥关系TAT,我们要求的是下面的问题: 给定\ ...
- 如何启动 SQL Server Agent(SQL Server 配置管理器)
如何启动 SQL Server Agent(SQL Server 配置管理器) SQL Server 2008 R2 其他版本 4(共 6)对本文的评价是有帮助 - 评价此主题 可以从 SQL S ...
- [codility]Equi-leader
http://codility.com/demo/take-sample-test/equileader 一开始想到从左和右两边开始扫取众数,但求众数又要重新扫一遍,这样复杂度就是O(n^2)了.此题 ...
- [jobdu]不用加减乘除做加法
使用异或和与,模拟机器的加法.http://blog.csdn.net/htyurencaotang/article/details/11125415 #include <iostream> ...