簡記非物理場:我的代碼試圖更新德爾福XE TClientDataset
非物理領域,(連接到TSQLQuery
其SQL
屬性集),它們是由運行時Open
命令創建的。我需要避免試圖更新德爾福的TClientdataSet連接到TSQLQuery
我具有連接到與連接到一個TSQLConnection
一個TSQLQuery
一個TDatasetProvider
一個TClientDataset
。這些對象中的前三個被封裝在一個庫中的幾個類中,我在很多地方使用了幾個項目。這些類在運行時創建這3個對象,並消除了大量的重複代碼,因爲我有許多這樣的三元組。
非常典型,我將在TSQLQuery
的SQL
屬性中指定某些SQL,並呼籲TClientDataSet
Open
加載從數據庫中TClientDataset
。在TClientDataset
的Fields
通過這個呼叫Open
即創建。它們在Open
之前不存在。
我遇到了一個問題,其中生成到TClientDataset
的三個字段是非物理的;也就是說,SQL會進行計算以生成它們。不幸的是,在TClientDataset
中,這3個字段的創建方式與物理字段不同。他們FieldKind
是fkData
(理想情況下是fkInternalCalc
),Calculated
屬性是False
(理想情況下是True
)及其ProviderFlags
包括pfInUpdate
(在理想情況下不應該)。毫不奇怪,當談到時間做對TClientDataset
一個異常被拋出的ApplyUpdates
...
Project XXX.exe raised exception class TDBXError with message
SQL State: 42S22, SQL Error Code: 207 Invalid column name 'Received'.
SQL State: 42S22, SQL Error Code: 207 Invalid column name 'Issued'.
SQL State: 42S22, SQL Error Code: 207 Invalid column name 'DisplayTime'.
我可以在TDatasetProvider
的OnUpdateData
事件處理程序清除這些領域的pfInUpdate
標誌避免這個錯誤。然而,這個解決方案要求這個函數知道特定的字段名稱,它位於上面提到的泛型類中,因此破壞了代碼的一般性。
我在尋找的是將這些字段的計算性質通知給事件處理函數的通用方法。
的Open
呼叫後我不能改變他們的FieldKind
或Calculated
性質(以fkInternalCalc
和True
分別),因爲這產生一個WorkCDS: Cannot perform this operation on an open dataset
異常消息。而且,由於Fields
尚不存在,我無法在撥打Open
之前更改這些屬性。
我可以Open
之後,從這些Field
的ProviderFlags
屬性中刪除pfInUpdate
標誌,但這沒有得到傳遞到‘三角洲’TClientDatset
即到達OnUpdateData
事件處理程序。我也嘗試設置字段的FieldDefs.InternalCalcField
屬性;再次,這不會傳遞給Delta數據集。
所以,我嘗試過的所有信令想法都沒有奏效。我會很感激任何新的想法或替代方法。
我遇到的所有互聯網搜索結果(包括Cary Jensen的優秀文章)都涉及設計時或非SQL生成的設置,這些設置不適用於我的情況。
您的組件是從TClientDataSet派生的還是組合的? – jachguate
希望我已經理解你的問題。我提到的兩個類本身不是組件,而是它們包含TClientDataSet,TDataSetProvider和TSQLQuery類,其中沒有一個是派生的,即。不分類。在這兩個類中,一個從另一個派生,而兩個派生的基類只從TObject派生。 –
你如何打開內部的ClientDataSet?我的意思是,你是否在你的類上調用了一個方法,或者你直接調用內部的ClientDataSet.Open方法? – jachguate