2017-09-27 58 views
-1

如何理解上TQuery組件PostApplyUpdates方法之間的差別現在是Post被更改寫入到本地內存,然後用ApplyUpdates它是將數據寫入到表中。所以我的第一個問題是如果這是正確的?上TQuery組件崗位和方法的ApplyUpdates德爾福

現在還有其他的東西我不明白。下面是代碼:

if (TQuery.State in [dsEdit, dsInsert]) then 
begin 
TQuery.Post;  
end; 
TQuery.ApplyUpdates; 

後,我用Post沒有TQuery.SQL.Text刪除本身?其實我可以輸入新的SQL語句並執行它嗎?準確地說,新的SQL語句應該是檢查表中是否存在記錄的SQL代碼,並且只有當答案是'否'時才應該完成。

什麼我問,是該代碼正確(假設VAR是局部變量,它是整數):

if (TQuery.State in [dsEdit, dsInsert]) then 
begin 
TQuery.Post;  
TQuery.SQL.Text := 'IF EXIST (Select ...) SET '+ var.l + ' = 1'; 
TQuery.ExecSQL; 
end; 
If var <> 1 
TQuery.ApplyUpdates; 
+0

請不要發佈不會編譯的僞碼,就像您在q中包含的示例一樣,因爲它只會浪費讀者的時間。同時,-1。相反,cut'n從你的項目中粘貼你的實際代碼。 – MartynA

+0

@MartynA這並不好。我已經很好地解釋了我需要的幫助。整個應用程序太大了,不能在這裏粘貼,我的工作只是創建這個程序,我不是很瞭解整個應用程序。如果我那時我不會問,相反我會回答你的問題。 – nikname

+0

呃,我很抱歉,但是您應該通過發佈**實際**代碼來顯示您對FOC幫助的讀者的一些小問題,而不是您在編寫問題時鍵入的內容。如果你不能這麼做,爲什麼有人需要麻煩回答? – MartynA

回答

0

如果CachedUpdates已啓用,您是對的。然後,Post將僅將數據集的更新存儲在本地存儲器中,而不是將其寫入底層數據庫表。請注意,可以將多個更改存儲在內存中。你的應用程序可能不需要它,並有辦法阻止它,但我不知道爲什麼然後使用CachedUpdates進行單個記錄。但是這意味着您嘗試檢查數據庫中是否存在活動記錄可能是徒勞的,因爲它缺少其他更新的記錄。

但一些關於Applying BDE-based Cached Updates可能會幫助你的情況:

當應用數據庫事務的控制下更新的 發生以下事件:

  • 一個數據庫事務開始。
  • 緩存的更新被寫入數據庫(階段1)。如果您提供它,則會爲寫入數據庫的每條記錄 觸發一次OnUpdateRecord事件。如果在向數據庫應用 記錄時發生錯誤,則在您提供 之一時會觸發OnUpdateError事件。如果寫成功或回滾,如果他們不

因此,有可能會對使用OnUpdateRecord事件每條記錄的基礎控制

  • 的事務被提交。有了這個事件,它的參數類型TUpdateKindTUpdateAction你應該能夠得到所需的行爲。下面的事件將跳過修改或插入記錄,根據您的問題中的僞代碼。您可能想重新考慮修改/編輯的記錄。我沒有實現檢查記錄是否存在的函數。

    procedure TForm1.Query1UpdateRecord(DataSet: TDataSet; 
        UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); 
    begin 
        // In case of edit or insert 
        if UpdateKind in [ukModify, ukInsert] then 
        begin 
        // Skip existing records 
        if ExistsCurrentRecord(DataSet) then 
         UpdateAction := uaSkip; 
        end; 
    end; 
    

    當你在你準備保存緩存的數據來看,你可能想Post查詢到在高速緩存中的最新變化,但然後檢查UpdatesPending以決定是否需要在應用更改像這樣的緩存:

    if Query.UpdatesPending then 
        Query.ApplyUpdates; 
    
  • +0

    謝謝你這麼好的解釋!我的代碼和你寫的代碼類似,我使用的是UpdatesPending,而不是在這個過程中。但是,再次,我會再次看看,也許這會更好,如果我在這裏也使用它。再次感謝你 :) – nikname

    0

    回答我的問題,Post方法不從TQuery組件刪除SQL查詢。 解決此問題的方法是分配新的本地TQuery變量並使用它來檢查記錄是否已存在於表中。