delphi三层结构常出现的问题和解决方案
以下问题出现原因有可能多个,暂时将我遇见的记录下来,以后有新的在陆续更新上去,有网友愿意的话也可以共同测试一下。
一,无法更新定位行。一些值可能已在最后一次读取已更改。
错误出现前提:
1, 录数据时,没有输或忘记输一些列就保存,之后重新修改记录,输入这些值后保存出现错误。
2, 多个人同时修改记录,后保存的几个人会出现。
分析原因:
1, 这种错误通常在数据库表中某一个或几个字段存在默认值,而在录的过程跳过了默认值列的输入,导致保存后记录显示和数据库不一致,保存会出现。
2, 第二种情况不用解释了,因为错误提示得很清楚。
解决方法:
1, 取消数据库表原先存在默认值的列的默认值。真的需要默认值的话,就在after
insert或before post事件里将默认值的列赋值。或者保存后刷新记录;
2,关于多人修改的问题,没办法解决;
二,unable to find record。No 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三层结构常出现的问题和解决方案的更多相关文章
- mvc与三层结构
http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑 ...
- mvc与三层结构终极区别
http://blog.csdn.net/csh624366188/article/details/7183872 http://www.cnblogs.com/zhhh/archive/2011/0 ...
- MySQL三层结构、用户权限、索引设计原则
一.守护进程是什么? Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对 ...
- 三层结构、MVC的简介
以前总是听说什么三层结构.什么MVC,但是一直傻傻分不清这是什么意思,下面来简单介绍一下它们吧~ 1.三层结构 在 B/S 架构中,系统标准的三层架构包括:表现层.业务层.持久层 1)表现层 也就是我 ...
- IOCP三层结构
iocp三层架构服务器模型 分类: GameEngine专题之IOCP(完成端口)2010-04-06 14:44 2611人阅读 评论(0) 收藏 举报 服务器socket工作测试应用服务器性能优化 ...
- Atitit.软件开发的三层结构isv金字塔模型
Atitit.软件开发的三层结构isv金字塔模型 第一层,Implements 层,着重与功能的实现.. 第二次,spec层,理论层,设计规范,接口,等.流程.方法论 顶层,val层,价值观层,原则, ...
- C#-WebForm-WebForm开发基础、如何给控件注册事件?——事件委托写法、http无状态性、三层结构
(小知识 - xml:可扩展的标记语言 html:超文本标记语言) 一.创建WebForm:新建→网站 此时文件夹中只有一个 config 文件,打开后 二.在项目下右键添加新项 在设计页面中打开 从 ...
- 在VS2010中建立C#三层结构
转自:http://www.blueidea.com/microsoft/vs2010/2010_con/2010081301.htm 三层结构,会有多个项目.为了让各项目之间的关系反映在目录结构上所 ...
- android的四层体系结构,基于mvc三层结构浅析
从多方面理解Android体系结构 1.以分层的方式来看Android 安卓体系结构分为四层. 首先看一下官方关于Android体系结构的图: 1).Linux Kernel:负责硬件的驱动程序.网络 ...
随机推荐
- java中的内部类详解
https://www.cnblogs.com/dolphin0520/p/3811445.html https://www.cnblogs.com/chenssy/p/3388487.html
- win10下btcd的安装和简单配置
btcd btcd github地址 1. 安装 1) 安装go的包管理工具glide glide github地址 $ go get -u github.com/Masterminds/glide ...
- HTML的day1 HTML的标签
a标签和锚点 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- matplotlib绘图总结《转》
本文作为学习过程中对matplotlib一些常用知识点的整理,方便查找. 类MATLAB API 最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数. from p ...
- Vue中table表头合并的用法
<div class="panel-container"> <div> <table class="table-head" wid ...
- oracle之分析函数解析及其应用场景
ORACLE 分析函数FIRST_VALUE,LAST_VALUE用法sum overavg over first_value overlast_value over...聚合函数结合over就是分析 ...
- suricata HTTP关键字
http request http request请求包括请求行.请求头.空行和内容.一个普通的request请求如下: http response http response应答包括应答行,头部,空 ...
- CentOS下安装Docker-CE
1.安装最新版本的话可以使用阿里云的自动安装脚本: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 2.安装指定的 ...
- Gitlab安装与备份恢复
GitHub是2008年由Ruby on Rails编写而成,与业界闻名的Github类似;但要将代码上传到GitHub上面,而且将项目设为私有还要收费.GitLab是一个用于仓库管理系统的开源项目, ...
- 26.Hibernate-主键和映射.md
目录 1.复合主键映射 [toc] 2.集合映射 2.1Set集合 2.2其他集合 [toc] 3.集合数据的读取 [toc] 4.一对多和多对一映射 4.1概念 4.2配置和开发 4.2.1关键点 ...