以下问题出现原因有可能多个,暂时将我遇见的记录下来,以后有新的在陆续更新上去,有网友愿意的话也可以共同测试一下。

一,无法更新定位行。一些值可能已在最后一次读取已更改。

错误出现前提

1, 录数据时,没有输或忘记输一些列就保存,之后重新修改记录,输入这些值后保存出现错误。

2, 多个人同时修改记录,后保存的几个人会出现。

分析原因:

1, 这种错误通常在数据库表中某一个或几个字段存在默认值,而在录的过程跳过了默认值列的输入,导致保存后记录显示和数据库不一致,保存会出现。

2, 第二种情况不用解释了,因为错误提示得很清楚。

解决方法:

1, 取消数据库表原先存在默认值的列的默认值。真的需要默认值的话,就在after 
insert或before post事件里将默认值的列赋值。或者保存后刷新记录;

2,关于多人修改的问题,没办法解决;

二,unable to find recordNo Key specified

错误出现前提:

1,修改状态下,删除或者修改自己数据,保存发现。

分析原因:

1,Provider的updateModel设置为upwhereAll,数据中存在日期字段,而且该字段还是用数据库的getdate()去获取的,delphi的日期是不包含毫秒,而数据库却包含了,这样就造成前后数据不一致的原因;

2,Provider的updateModel设置为upWhereKeyOnly,没有设置子集的主键,导致更新或删除找不到主键;

解决方法:

1,设置子集的主键,假设为id,

在子集的before 
post事件里写入以下语句:

PS:ADODet是子集,CDSDet是中间层,即TClientDataSet

if CDSDet.State in [dsinsert] then
begin
with ADODet.FieldByName('id') do
    ProviderFlags := ProviderFlags - [ pfInKey ];
end
else if CDSDet.State in [dsedit] then
begin
with ADODet.FieldByName('id') do
  ProviderFlags := ProviderFlags + [ pfInKey ];
end;

在子集的before 
delete事件里写

with ADODet.FieldByName('id') do
    ProviderFlags := ProviderFlags + [ pfInKey ];

三,Key Violation

错误出现前提:

1,修改子集保存过一次的状态下,重新修改子集,新增记录,超过一条的(第二条保存时)出现;

分析原因:

1,数据库表存在自增列,假设为id,在新增记录时,子集无法及时获取新的id,照成保存时出现主键重复的问题;

解决方法:

1,定义全局变量FID:integer=-1,在子集的before 
post或者On new Record事件中写:

if CDSDet.State in [dsinsert] 
then
begin
CDSDet.Fields.Fields[i].ReadOnly:=False;
CDSDet.Fields.Fields[i].AsInteger:=FID;
Dec(FID);
end;

delphi三层结构常出现的问题和解决方案的更多相关文章

  1. mvc与三层结构

    http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑 ...

  2. mvc与三层结构终极区别

    http://blog.csdn.net/csh624366188/article/details/7183872 http://www.cnblogs.com/zhhh/archive/2011/0 ...

  3. MySQL三层结构、用户权限、索引设计原则

    一.守护进程是什么? Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对 ...

  4. 三层结构、MVC的简介

    以前总是听说什么三层结构.什么MVC,但是一直傻傻分不清这是什么意思,下面来简单介绍一下它们吧~ 1.三层结构 在 B/S 架构中,系统标准的三层架构包括:表现层.业务层.持久层 1)表现层 也就是我 ...

  5. IOCP三层结构

    iocp三层架构服务器模型 分类: GameEngine专题之IOCP(完成端口)2010-04-06 14:44 2611人阅读 评论(0) 收藏 举报 服务器socket工作测试应用服务器性能优化 ...

  6. Atitit.软件开发的三层结构isv金字塔模型

    Atitit.软件开发的三层结构isv金字塔模型 第一层,Implements 层,着重与功能的实现.. 第二次,spec层,理论层,设计规范,接口,等.流程.方法论 顶层,val层,价值观层,原则, ...

  7. C#-WebForm-WebForm开发基础、如何给控件注册事件?——事件委托写法、http无状态性、三层结构

    (小知识 - xml:可扩展的标记语言 html:超文本标记语言) 一.创建WebForm:新建→网站 此时文件夹中只有一个 config 文件,打开后 二.在项目下右键添加新项 在设计页面中打开 从 ...

  8. 在VS2010中建立C#三层结构

    转自:http://www.blueidea.com/microsoft/vs2010/2010_con/2010081301.htm 三层结构,会有多个项目.为了让各项目之间的关系反映在目录结构上所 ...

  9. android的四层体系结构,基于mvc三层结构浅析

    从多方面理解Android体系结构 1.以分层的方式来看Android 安卓体系结构分为四层. 首先看一下官方关于Android体系结构的图: 1).Linux Kernel:负责硬件的驱动程序.网络 ...

随机推荐

  1. Python图形开发之PIL

    1.背景介绍 PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 2.安装 Windows平台:PIL官 ...

  2. 初识rt-thread

    bernard.xiong CEO 熊谱祥 env,提供编译构建环境.图形化系统配置及软件包管理功能 scons 是 RT-Thread 使用的编译构建工具,可以使用 scons 相关命令来编译 RT ...

  3. 减小delphi体积的方法

    1.关闭RTTI反射机制  自从Delphi2010中引入了新的RTTI反射机制后,编译出来的程序会变得很大,这是因为默认情况下 Delphi2010 给所有类都加上了反射机制.而我们的工程并不每每都 ...

  4. [UE4]Dynamic Entry Box

    Dynamic Entry Box:条目创建容器 一个特殊的容器,能够自动创建条目,在可变数量条目的时候,但是又不值得创建一个ListView或者Tile View. 注意: Dynamic Entr ...

  5. MySQL安全机制 DDL DCL

    一.MySQL用户管理 1. 修改用户密码 ===root修改自己密码=== 方法一: # mysqladmin -uroot -p'123' password 'new_password' //12 ...

  6. 采用link方式解决zabbix对于备份监控和ORACLE日志监控由于路径不统一的问题

    #对于备份监控和ORACLE日志监控由于路径不统一,我们可以采用link的方式如:#ln -s 原路径 新路径(/zabbix/logs)#新路径统一放在/zabbix/logs下具体看模板指定. # ...

  7. 涂抹mysql笔记-InnoDB/MyISAM及其它各种存储引擎

    存储引擎:一种设计的存取和处理方式.为不同访问特点的表对象指定不同的存储引擎,可以获取更高的性能和处理数据的灵活性.通常是.so文件,可以用mysql命令加载它. 查看当前mysql数据库支持的存储引 ...

  8. win10 64 + VS2010 + Opencv 2.4.9 + HIKVISION(海康)

    海康相机型号:DS-2CD2512F-IS 参考连接http://blog.csdn.net/wanghuiqi2008/article/details/31404571 先上效果图 其中,在连接时遇 ...

  9. kettle 无法正常启动问题

    Java环境配置后,双击spoon.bat无法打开 修改spoon.bat里内存配置: if "%PENTAHO_DI_JAVA_OPTIONS%"=="" s ...

  10. React琐碎

    1 dangerouslySetInnerHTML 使用此属性的原因是得到一个安全的数据,生成一个仅包含唯一key——__html的对象,表明这段内容会被当成text/taint使用,它的使用方式是这 ...