2017-01-06 60 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.'); 

试试吧...