TField.ProviderFlags,這對於組 SQL 來說至關重要!
ProviderFlags 是 TProviderFlag 的集合,我們來看看 ProviderFlags 可以包含哪些元素
元素名稱 說明 備註
pfInUpdate INSERT / UPDATE 要包含此欄位 實際上會不會包含,要看欄位值有沒有變動而定
pfInWhere UPDATE / DELETE 時要加入 WHERE 實際上會不會加入 WHERE,要看欄位值有沒有變動而定
pfInKey UPDATE / DELETE 時要加入 WHERE,以及 DataSet 內資料的重複檢查 一定會加入WHERE
pfHidden 隱藏欄位,僅作為保存資料用途,避免資料衝突,外界無法使用
元素名稱 說明 備註
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
屬性值 說明
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 的欄位
例如: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 的欄位,所以會發生錯誤
DataSetProvider.UpdateMode 為 upWhereAll
當 UPDATE 時,B4 會組進 SQL,但 B4 並不是 A 的欄位,所以會發生錯誤
於是 ProviderFlags 的設法應該為:
A1 = [pfInKey, pfInUpdate]
A2 = [pfInUpdate]
A3 = [pfInUpdate]
B4 = []
而且 DataSetProvider.UpdateMode 設為 upWhereKeyOnly
這樣 B4 就不會加入 UPDATE 的 SQL,就 OK 了
A1 = [pfInKey, pfInUpdate]
A2 = [pfInUpdate]
A3 = [pfInUpdate]
B4 = []
而且 DataSetProvider.UpdateMode 設為 upWhereKeyOnly
這樣 B4 就不會加入 UPDATE 的 SQL,就 OK 了
不管 JOIN 幾個 TABLE,設定 ProviderFlags 的原則為
主檔 PK 欄位要有 pfInKey
主檔需要 UPDATE 的欄位要有 pfInUpdate
主檔不需要 UPDATE 的欄位,以及所有 JOIN 進來的欄位就給他 空集合
主檔 PK 欄位要有 pfInKey
主檔需要 UPDATE 的欄位要有 pfInUpdate
主檔不需要 UPDATE 的欄位,以及所有 JOIN 進來的欄位就給他 空集合
要設定在 DataSetProvider.DataSet 指到的 DataSet 裡面的 Field 才行