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 才行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现