2017-01-06 105 views
2

蔭試圖刪除我的FDTable組件中的所有記錄,所有記錄使用,德爾福刪除FDTable

mytable.Delete;

,但沒有記錄被越來越刪除。

任何人都可以建議我一種方法來刪除FdTable中的所有記錄。

編輯

我修改了它以這種方式,

for i := mytable.RecordCount - 1 downto 0 do 
    begin 
    mytable.Delete; 
    end; 
    mytable.Refresh; 

,但它正在採取大量的時間,因爲在我的fdtable很多行。

+0

什麼是底層數據庫? - +多少行? – user763539

+3

雖然@MartynA給了你正確的答案,但值得注意的是,你應該從不**像你使用RecordCount那樣使用它,因爲它強制讀取表中的每一行來計算。相反,使用'while not MyTable.IsEmpty'。下一步是學習如何查找描述'EmptyDataSet'和'IsEmpty'的文檔。 –

+0

@ user763539,我的底層數據庫是Oracle 11g。 – userhi

回答

2

刪除底層數據庫表中的所有記錄(最好的方式取決於數據庫)和調用刷新一次。

如果您必須通過TFdTable執行此操作,請使用BeginBatch,執行刪除操作(不刷新),EndBatch並且只有Refresh操作。

mytable.BeginBatch; 
for i := mytable.RecordCount - 1 downto 0 do 
begin 
    mytable.Delete; 
end; 
mytable.EndBatch; 
mytable.Refresh; 
+0

如果表中沒有行增加,則會再次出現性能問題。 刪除當前的600行花費很多時間。如果它增加超過1000或其他東西,應用程序將被吊死。 – userhi

+4

然後採取第一種方法。直接從數據庫中清除數據,而不引用myTable,然後刷新myTable。使用類似於SQL語句的DELETE FROM * TableName *' – Dsm

0

嘗試

如果刪除所有行將會妨礙性能。

如果這不起作用,那麼爲什麼不創建數據集運行時,然後釋放該對象。

+0

真的嗎?你只需關上桌子並打開它,別無他法。 – Sami

5

嘗試

MyTable.EmptyDataSet; 

有可能是有點超過,這樣做,但你不說你是如何在第一時間填充MyTable

+0

我已經將MyTable連接到DB中的表中,MyTable將直接從DB獲取數據,然後iam將myTable中的相同數據發佈到ClientDataSet,然後我必須清空mytable中的所有數據。 正如你所說我也嘗試了'myTable.EmptyDataset'但是,它只刪除一行,它只適用於我在for循環中使用它。 – userhi

+0

你是否真的想從數據庫中刪除記錄,或者將它們從MyTable中刪除,但將它們留在數據庫中? – MartynA

+0

這些也應該在數據庫中刪除。 – userhi

0

我建議你使用存儲過程的工作,而不是從你的應用程序的SQL。由於存儲過程直接在服務器上運行,因此存儲過程很容易製作和快速發展。 只需爲您的表創建一個存儲過程;

sp_deleteall

,並在其中做SQL單行:

從MYTABLE

刪除您的應用程序,在形式,鏈接拖放一個TFDStoredProc它到您的服務器上的存儲過程,只需調用 `

sp_deleteall.ExecProc;

知道有多少記錄被刪除剛纔打電話時,程序執行後:

ShowMessage(IntToStr(sp_deleteall.RowsAffected) + ' records were deleted.'); 

試試吧...