zoukankan      html  css  js  c++  java
  • delphi三层结构常出现的问题和解决方案

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

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

    错误出现前提

    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;

  • 相关阅读:
    异步加载技术实现瀑布流效果
    点击向下展开的下拉菜单特效
    几个个实用的PHP代码片段【自己备份】
    cache和buffer区别探讨
    windows 文本文件放到linux下使用
    制作rpm包
    mariadb在线热备份做主从
    检查目录下备份文件的脚本
    different between method and function
    mysql忘记root密码解决
  • 原文地址:https://www.cnblogs.com/linjincheng/p/9856534.html
Copyright © 2011-2022 走看看