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

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

错误出现前提

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. 如何从 VSS 迁移到Team Foundation Server

    TFS 2012自带了vss upgrade wizard工具, 在Team Foundation Server管理控制台左侧的最后一个菜单其他工具和组件中,选择Visual SourceSafe升级 ...

  2. PowerDesiger 生成C#实体类,字段转变成大小写方法

    1.打开编辑生成C#实体类的PD脚本 2..L:  表示全部转小写,.U: 表示全部转成大写.

  3. Struts2 <s:select >标签的使用

    select 取值session中的内容 <s:select name="meal.mealseries.seriesid" list="#session.meal ...

  4. spring梳理

  5. Python中xlrd和xlwt模块使用方法

    本文主要介绍可操作excel文件的xlrd.xlwt模块.其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入. 安装xlrd和xlwt模块 xlrd和xlwt模块不是 ...

  6. 03 字符串常用操作方法及For 循环

    字符串常用操作 s = 'alexWUsir' s1 = s.capitalize() #首字母大写 print(s1) #Alexwusir s2 = s.upper() #全部大写 print(s ...

  7. JAVA Maven 安装 jar 包到本地仓库,以 Oracle11g 的访问包 为例

    maven 作为 java 的首选包管理工具,使我们在创建和维护项目的时候变得十分简单,但是 maven 仓库并不是拥有的一切 jar 包的, 很多 jar 包由于收费或者版权什么的其他原因,并不存在 ...

  8. Http协议和Https协议的安全性问题

    https://www.cnblogs.com/intsmaze/p/6009648.html https://blog.csdn.net/jeffleo/article/details/768630 ...

  9. python练习题_02

    #1.有两个列表 l1=[11,22,33] l2=[22,33,44] #a.获取内容相同的元素列表 l3=[] for i in l1: if i in l2: l3.append(i) prin ...

  10. docker mysql Exit 1

    用laradock启动mysql时,state总是 Exit 1 ,docker-compose build后也没有效果 这时应该在-/.laradock/data(.env的DATA_PATH_HO ...