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 才行
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值