delphi三层结构常出现的问题和解决方案
2011-03-13 18:53
204 查看
以下问题出现原因有可能多个,暂时将我遇见的记录下来,以后有新的在陆续更新上去,有网友愿意的话也可以共同测试一下。
一,无法更新定位行。一些值可能已在最后一次读取已更改。
错误出现前提:
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;
一,无法更新定位行。一些值可能已在最后一次读取已更改。
错误出现前提:
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三层结构常出现的问题和解决方案
- delphi 三层 主从表结构,更新是出错,错误信息不详的问题解决
- 在Delphi中使用三层结构ClientDataSet出现 Unable to find record or record ...
- 三层结构中解决同一解决方案不同项目中访问Web.config文件的问题
- 常见对象_Scanner获取数据出现的小问题及解决方案
- 关于Struts2在web.xml中配置后出现404错误的问题,完美解决方案!
- C# Mobile远程调用WebService时,返回DataTable出现隐式转换出问题的解决方案
- 在PHP5.3以上版本运行ecshop出现的问题及解决方案
- 安装CentOS 7 出现的问题的解决方案
- VMware Workstation 运行出现“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”解决方案
- asp插入数据到Access数据库出现的最他NAINAI让人脑火的问题,解决方案
- 今天搞log4net插入错误日志去mysql数据库的时候出现了点问题,已解决。记录下解决方案
- 解决在asp.net中 使用 ajax UpdatePanel出现乱码问题的解决方案
- 不同编码页面之间用form传值出现乱码问题解决方案 utf-8 到 gb2312
- vs2015运行c++出现的小问题及解决方案(希望能帮助一些和我一样的新手)
- 关于Mysql+EF6本地运行和发布没有问题,发布到服务器上出现问题的解决方案
- MYSQL电脑客户端免安装教程以及出现问题解决方案
- [转 TDD] 如何坚持TDD:使用者出现的问题以及解决方案
- 安装完jdk-7后安装Eclipse,出现JVM找不到的问题解决方案之一
- 关于iOS11下关于UIViewController属性弃用导致含有ScrollView功能的控件出现问题的解决方案