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 才行
————————————————
版权声明:本文为CSDN博主「qq_29786017」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29786017/article/details/89812622
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 才行
————————————————
版权声明:本文为CSDN博主「qq_29786017」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29786017/article/details/89812622
分类:
delphi新功能
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2021-09-23 system.hash.pas md5