Delphi删除FDTable中的所有记录

3
我正在尝试使用以下方法删除我的FDTable组件中的所有记录: mytable.Delete; 但是没有记录被删除。请问有没有人能够建议一种在FdTable中删除所有记录的方法。 编辑 我按照以下方式进行了修改:
  for i := mytable.RecordCount - 1 downto 0 do
  begin
    mytable.Delete;
  end;
  mytable.Refresh;

但是由于我的fdtable中有很多行,所以这需要花费很长时间。


什么是底层数据库? -+ 有多少行? - user763539
3
虽然@MartynA已经给出了正确的答案,但值得注意的是,您不应该像您目前使用RecordCount一样使用它,因为这会强制对表中的每一行进行读取以计算。相反,请使用while not MyTable.IsEmpty。您接下来需要学习如何查找文档,其中描述了EmptyDataSetIsEmpty的用法。 - Ken White
@user763539,我的底层数据库是Oracle 11g。 - userhi
为了获得更好的性能,您可以尝试使用SQL删除所有记录。 使用SQL组件和类似于以下查询的查询语句:“DELETE FROM Table”。 使用SQL,服务器(Oracle)会代替客户端执行操作。 - Germán Estévez -Neftalí-
6个回答

7

尝试

MyTable.EmptyDataSet;

可能还需要做更多的工作,但你并没有说清楚如何首先填充MyTable


我已经将MyTable连接到数据库中的一个表,MyTable将直接从数据库获取数据,然后我将相同的数据发布到ClientDataSet中,然后我必须清空mytable中的所有数据。正如你所说,我也尝试了myTable.EmptyDataset,但是它只删除一行,只有在for循环中使用它才有效。 - userhi
你是真的想从数据库中删除记录,还是只是从你的MyTable中删除它们但在数据库中保留它们? - MartynA
这些也应该在数据库中被删除。 - userhi
DB是什么类型?您使用SQL检索记录吗? - MartynA
1
如果您希望数据在数据库中也被删除,那么最好的解决方案是运行 SQL 语句 (Delete From tablename),让数据库层来处理所有工作。我不清楚 myTable (FDTable) 如何同时删除数据库中的数据。 - Alec
@MartynA,在旧的BDE代码中,我们使用Paradox表创建了一个Paradox表,并从主数据库(Oracle)表中添加数据,然后清除主数据库(Oracle)表并再次将数据从Paradox表发布到主数据库(Oracle)中。现在我们用FireDac替换了BDE,用ClientDataset替换了Paradox。 - userhi

3

删除底层数据库表中的所有记录(最佳方法取决于数据库),然后仅调用一次refresh。

如果必须通过TFdTable进行操作,请使用BeginBatch,执行删除(不刷新),然后EndBatch,并且仅在此之后Refresh。

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

如果表中的行数增加,性能问题将再次出现。 删除当前的600行需要很长时间。如果它增加到1000或其他数量,应用程序将挂起。 - userhi
4
采用第一种方法。直接从数据库中清除数据,无需参考“myTable”,之后刷新“myTable”。使用类似于SQL语句“DELETE FROM TableName”这样的语句。 - Dsm

0

尝试

因为删除所有行会影响性能,所以不要这样做。

如果那样不起作用,为什么不在运行时创建数据集,然后释放对象呢?


真的吗?你只是关闭表格然后重新打开,没有别的操作吗? - Ilyes

0

从最快到最慢的顺序。前两个是在服务器端执行的命令。

  1. 关闭表并执行SQL DDL命令TRUNCATE TABLENAME;,然后重新打开。这需要对表进行独占访问。
  2. 使用SQL DML命令DELETE FROM TABLENAME;。这不需要独占访问。
  3. 在客户端使用循环。速度较慢,并会触发大量客户端事件。

0

删除 FDMemTable 上的所有记录所需做的就是:

MyTable.Active := False;

0
我建议你使用存储过程来完成这项工作,而不是从应用程序中使用SQL。存储过程很容易制作,并且非常快速,因为它们直接在服务器上操作。只需为表创建一个存储过程:

sp_deleteall

并在其中输入一行SQL:

delete from mytable

从应用程序中,在窗体上放置一个 TFDStoredProc,将其链接到服务器上的存储过程,然后只需调用该过程即可。

sp_deleteall.ExecProc;

要知道删除了多少条记录,只需在过程执行后调用:

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

试一下...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接