• TField.ProviderFlags 数据更新的选项


    TField.ProviderFlags,这对于组 SQL 来说至关重要!

    ProviderFlags 是 TProviderFlag 的集合,我们来看看 ProviderFlags 可以包含哪些元素
            元素名称 说明  备注
    pfInUpdate INSERT / UPDATE 要包含此字段 实际上会不会包含,要看字段值有没有变动而定
    pfInWhere UPDATE / DELETE 时要加入 WHERE 实际上会不会加入 WHERE,要看字段值有没有变动而定
    pfInKey UPDATE / DELETE 时要加入 WHERE,以及 DataSet 内数据的重复检查 一定会加入WHERE
    pfHidden 隐藏字段,仅作为保存数据用途,避免数据冲突,外界无法使用  

    另外,还有一个跟组 SQL 有关的重要属性:TDataSetProvider.UpdateMode
    属性值 说明
    upWhereAll 所有字段均会加入 WHERE
    upWhereChanged (有变动,且有 pfInWhere 的字段) OR (有 pfInKey 的字段),会加入 WHERE
    upWhereKeyOnly 只有 pfInKey 的字段会加入 WHERE

    这两个属性决定了组 SQL 的结果
    例如:select A.A1, A.A2, A.A3, B.B4 from TABLE_1 A  inner join TABLE_2 B on A.A1=B.B1
    有四个字段 A1, A2, A3, B4,A1 是 A  的 PK
    但是更新时只要更新 A 的字段,不要更新 B 的字段

    如果完全依照默认值,各字段的 ProviderFlags 都是 [pfInUpdate, pfInWhere]
    DataSetProvider.UpdateMode 为 upWhereAll
    当 UPDATE 时,B4 会组进 SQL,但 B4 并不是 A 的字段,所以会发生错误

    于是 ProviderFlags 的设法应该为:
    A1 = [pfInKey, pfInUpdate]
    A2 = [pfInUpdate]
    A3 = [pfInUpdate]
    B4 = []
    而且 DataSetProvider.UpdateMode 设为 upWhereKeyOnly
    这样 B4 就不会加入 UPDATE 的 SQL,就 OK 了

    不管 JOIN 几个 TABLE,设定 ProviderFlags 的原则为
    主檔 PK 字段要有 pfInKey
    主檔需要 UPDATE 的字段要有 pfInUpdate
    主檔不需要 UPDATE 的字段,以及所有 JOIN 进来的字段就给他 空集合

    要设定在 DataSetProvider.DataSet 指到的 DataSet 里面的 Field 才行

  • 相关阅读:
    解决DataGridView绑定List后不能排序的问题
    最新的皮肤下载
    我收录的名言
    HttpRequest访问Https带有证书并使用WSDL文档生成代理类方案(2)
    最新的Functions 类
    华兴软通短信接口简单使用WebServices版
    最新的SqlHelper 类
    闲来没事写个记事本玩玩!!!
    "基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系"证书验证失败的解决过程(3)
    FCK配置
  • 原文地址:https://www.cnblogs.com/Thenext/p/14457217.html
Copyright © 2020-2023  润新知