2015-08-03 86 views
-1

我試圖實現從tClientDataSet向數據庫表(數據庫是Sybase ASA)插入/複製記錄。將ClientDataset記錄複製到數據庫表

我也有一個窗體上有一個cxgrid它可以看到來自CD的記錄,所以我知道里面有記錄。

一個按鈕,點擊我做到以下幾點:

with dmData.cds do 
    begin 
    Close; 
    Open; 
    First; 
    while not (EOF) do 
    begin 
     dmData.qry1.Open; 
     dmData.qry1.Insert; 
     dmData.qry1.FieldByName('field1').AsString := dmData.cds.FieldByName('field1').AsString; 
     dmData.qry1.FieldByName('field2').AsString := dmData.cds.FieldByName('field2').AsString; 
     dmData.qry1.FieldByName('field3').AsString := dmData.cds.FieldByName('field3').AsString; 
     dmData.qry1.Post; 
     Next; 
    end; 
    end; 

後這樣做了,但在數據庫表中查找時沒有插入記錄我沒有得到任何錯誤。

我不知道我在做什麼錯,任何幫助將不勝感激。

+0

正如Kobim所說,dmData.qry1中的SQL可能不正確。請[編輯]您的問題並顯示使用您的查詢。 –

+1

在'ApplyUpdates'結尾添加:此時,您正在更新ClientDataSet中的數據; 'ApplyUpdates'將數據傳輸到底層數據集。 –

+1

重要的問題是:你用什麼樣的查詢將記錄插入數據庫以及他的SQL是什麼?如果我們不知道這一點,我們無法幫助你。無論如何,您可以使用:'dmQuery.qry1.SQL:='insert into table_name(field1,field2,field3)values(dmData.cds.FieldByName('field1')。AsString,dmData.cds.FieldByName('field2') .AsString,dmData.cds.FieldByName( '字段3')AsString)。 'dmQuery.qry1.ExecSql;' –

回答

0

看來你正在試圖做TClientDataSet爲你做的工作。爲了讓這一切工作,你需要三個組成部分:

  1. 能談談您的數據服務器的數據集的情況下,已經配置的話
  2. 引用以前的數據集,通過使用TDatasetProvider實例在Dataset財產
  3. 引用以前的供應商,通過使用ProviderName財產

TClientDataset(CDS)中的所有記錄後的TClientDataSet一個實例是已更新,請致電ApplyUpdates(0)將其發送給提供商。當您調用此方法時,CDS將生成一個名爲Delta Delta的數據包,並記錄必須保留並將其發送給提供者。

供應商不知道如何保留Delta中存在的記錄,因此它與您分配給它的數據集保持一致。對於Delta中的每個記錄,相應的操作將在數據集上執行,因此數據服務器將開始接收命令。

最後,提供程序通知CDS一切正常(這稱爲協調),最終返回插入操作期間生成的密鑰。這些密鑰將出現在CDS中。

畢竟,已更改記錄的狀態將被清除,以便報告沒有待處理的更改(您的代碼沒有執行的重要事項)。

我建議您閱讀關於DataSnap的更多信息,以便真正掌握它。 Delphi幫助提供了足夠的信息。

相關問題