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 才行

  • 相关阅读:
    git的搭建与简单实用
    zabbix项目实践
    zabbix的搭建与入门
    zabbix的深入了解
    harbor私有镜像仓库的搭建与使用与主从复制
    tensorflow 在windows下的安装
    word2vec:基本的安装及使用简介
    cs231n(三) 误差反向传播
    cs231n笔记(二) 最优化方法
    cs231n笔记 (一) 线性分类器
  • 原文地址:https://www.cnblogs.com/Thenext/p/14457217.html
Copyright © 2011-2022 走看看