zoukankan      html  css  js  c++  java
  • 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 才行

  • 相关阅读:
    06 is和==的区别 encode()编码 decode()解码
    05 dic的增删改查 字典的嵌套 考试题dic.get()的相关使用
    03 编码 int ,bool,str的常用操作 主要讲str
    01 基本数据类型 变量 if语句
    04 列表的增删改查 常用方法 元祖 range
    02 while循环 格式化输出 运算符
    多校2 Harmonious Army hdu6598 网络流
    P3159 [CQOI2012]交换棋子 网络流
    P2172 [国家集训队]部落战争 最大流
    P2402 奶牛隐藏 网络流
  • 原文地址:https://www.cnblogs.com/Thenext/p/14457217.html
Copyright © 2011-2022 走看看