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

  • 相关阅读:
    Hasura GraphQL schema 生成是如何工作的
    一张方便的graphql schema 语言手册
    使用lua graphql 模块让openresty 支持graphql api
    PostgREST docker-compose 试用
    subzero 基于postgrest && openresty && rabbitmq 的快速rest/graphql 开发平台
    使用blessed 开发丰富的cli 应用
    一个方便查看数据库转换rest/graphql api 的开源软件的github 项目
    treeql 基于rest 标准的接口开发协议
    graphql-modules 企业级别的graphql server 工具
    hangfire docker-compose 运行
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2360661.html
Copyright © 2020-2023  润新知