【问题标题】:A fast way to delete all rows of a datatable at once一次删除数据表所有行的快速方法
【发布时间】:2012-06-19 14:30:01
【问题描述】:

我想删除数据表中的所有行。 我使用这样的东西:

foreach (DataRow row in dt.Rows)
{
  row.Delete();
}
TableAdapter.Update(dt);

它工作得很好,但如果我有很多行,它会花费很多时间。 有没有办法一次删除所有行?

【问题讨论】:

  • dr.Rows.Clear(); 呢?
  • 您想从数据表中删除它们还是从您的 dbms 中删除它们? @ShadowWizard:这将阻止它们从 dbms 中删除。
  • @Tim 表适配器的Update() 不会在表为空时删除所有行吗?
  • Delete all rows in a datatable 的可能重复项
  • @ShadowWizard:不,因为你已经从DataTable 中删除了所有行,所以没有什么可更新的了。只有 DataRowState=Deleted 的 DataTable 中的行会通过 DataAdapter.Update 删除。

标签: c# datatable


【解决方案1】:

如果您是针对 sqlserver 数据库运行代码,那么
使用这个命令

string sqlTrunc = "TRUNCATE TABLE " + yourTableName
SqlCommand cmd = new SqlCommand(sqlTrunc, conn);
cmd.ExecuteNonQuery();

这将是最快的方法,它将从您的表中删除所有内容并将身份计数器重置为零。

其他 RDBMS 也支持 TRUNCATE 关键字。

5 年后:
回顾这个答案,我需要添加一些东西。仅当您绝对确定 yourTableName 变量中值的来源时,上述答案才有效。这意味着你不应该从你的用户那里得到这个值,因为他可以输入任何东西,这会导致在this famous comic strip 中很好地描述的 Sql 注入问题。始终使用不可编辑的 UI 向用户展示硬编码名称(表格或其他符号值)之间的选择。

【讨论】:

  • 感谢大家的快速回答。我使用上述方法删除了 DBMS 和 dt.Rows.Clear() 中的所有行,然后清除我的表。太棒了。谢谢大家
  • @oMatrix,如果你从数据库表中删除记录(史蒂夫上面建议的方式),你不需要做 dt.Rows.Clear()。
  • @AshishGupta: dt.Rows.Clear() 除了从内存数据表中删除行之外什么都不做。它不会删除TableAdapter.Update(dt); 上的行,因为它们的DataRowStateunchanged
  • 命令中的连接字符串用什么?如果在代码中创建了 DataTable,我不明白我需要连接什么。
  • 这需要提交吗?
【解决方案2】:

这将允许您清除所有行并保持DataTable 的格式。

dt.Rows.Clear();

还有

dt.Clear();

但是,在 DataTable (dt) 上调用 Clear() 将从 DataTable 中删除列和格式。

根据code found in an MSDN questionDataRowsCollectionDataTable 使用不同的 boolean 参数调用内部方法:

internal void Clear(bool clearAll)
{
    if (clearAll) // true is sent from the Data Table call
    {
        for (int i = 0; i < this.recordCapacity; i++)
        {
            this.rows[i] = null;
        }
        int count = this.table.columnCollection.Count;
        for (int j = 0; j < count; j++)
        {
            DataColumn column = this.table.columnCollection[j];
            for (int k = 0; k < this.recordCapacity; k++)
            {
                column.FreeRecord(k);
            }
        }
        this.lastFreeRecord = 0;
        this.freeRecordList.Clear();
    }
    else // False is sent from the DataRow Collection
    {
        this.freeRecordList.Capacity = this.freeRecordList.Count + this.table.Rows.Count;
        for (int m = 0; m < this.recordCapacity; m++)
        {
            if ((this.rows[m] != null) && (this.rows[m].rowID != -1))
            {
                int record = m;
                this.FreeRecord(ref record);
            }
        }
    }
}

【讨论】:

  • DataTable.Clear() 和 Rows.Clear() 只会删除数据表中的所有行,而不是列,请参阅social.msdn.microsoft.com/Forums/en-US/…
  • @CarlosLiu 感谢您的链接!但是根据您共享的链接中显示的代码(我将其添加到我的答案中),DataTable Clear 方法实际上会清除列。只有 Rows.Clear() 会保留列。
  • 很抱歉被该线程中接受的答案所迷惑;-(但感谢您的澄清
【解决方案3】:

正如有人提到的,只需使用:

dt.Rows.Clear()

【讨论】:

  • 这将防止行被删除,因为只有 DataRowState=Deleted 的 DataRows 会通过 DataAdapter.Update 被删除。您只是将它们从(内存中)DataTable 中删除。
【解决方案4】:

这是通过DataAdapter 从dbms 中的表中删除所有行的最简单方法。但是如果你想批量做,你可以将DataAdapter的UpdateBatchSize设置为0(无限制)。

另一种方法是使用简单的SqlCommand 和CommandText DELETE FROM Table

using(var con = new SqlConnection(ConfigurationSettings.AppSettings["con"]))
using(var cmd = new SqlCommand())
{
    cmd.CommandText = "DELETE FROM Table";
    cmd.Connection = con;
    con.Open();
    int numberDeleted = cmd.ExecuteNonQuery();  // all rows deleted
}

但如果您只想从DataTable 中删除DataRows,则只需调用DataTable.Clear。这将防止任何行在 dbms 中被删除。

【讨论】:

  • 使用Using 可能是最友好的方式
【解决方案5】:

为什么不直接用 SQL 来做呢?

DELETE FROM SomeTable

【讨论】:

    【解决方案6】:

    只需使用dt.Clear()

    您还可以将 TableAdapter/DataAdapter 设置为在填充数据之前清除。

    【讨论】:

    • 它会清除 DataTable,但也会防止数据库中的任何行被删除(OP 想要恕我直言)。
    【解决方案7】:

    如果您真的关心速度而不担心数据,您可以执行截断。但这是假设您的 DataTable 位于数据库上,而不仅仅是内存对象。

    TRUNCATE TABLE tablename
    

    不同之处在于这会删除所有行而不记录行删除,从而使事务更快。

    【讨论】:

      【解决方案8】:

      Here 我们有同样的问题。您可以使用以下代码:

      SqlConnection con = new SqlConnection();
      con.ConnectionString = ConfigurationManager.ConnectionStrings["yourconnectionstringnamehere"].ConnectionString;
      con.Open();
      SqlCommand com = new SqlCommand();
      com.Connection = con;
      com.CommandText = "DELETE FROM [tablenamehere]";
      SqlDataReader data = com.ExecuteReader();
      con.Close();
      

      但在您需要将以下代码导入项目之前:

      using System.Configuration;
      using System.Data.SqlClient;
      

      这是可以删除所有行的代码的特定部分是一个表:

      DELETE FROM [tablenamehere]
      

      这必须是你的表名:tablenamehere - 这可以删除表中的所有行:DELETE FROM

      【讨论】:

      • 最初的问题是“如何从 DataTable 中删除行”而不是“从 SQL 中删除行”。我会说krillgar 有最好的答案
      【解决方案9】:

      我使用MDaf 只需使用此代码:

      DataContext db = new DataContext(ConfigurationManager.ConnectionStrings["con"].ConnectionString);
      db.TruncateTable("TABLE_NAME_HERE");
      //or
      db.Execute("TRUNCATE TABLE TABLE_NAME_HERE ");
      

      【讨论】:

        【解决方案10】:

        这是一种使用 Entity FW 且无需 SQL 注入或 TSQL 的干净而现代的方式。

        using (Entities dbe = new Entities())
        {
            dbe.myTable.RemoveRange(dbe.myTable.ToList());
            dbe.SaveChanges();
        }
        

        【讨论】:

          【解决方案11】:

          DataTable 类上是否有 Clear() 方法?

          我认为有。如果有,请使用它。

          【讨论】:

            【解决方案12】:

            Datatable.clear() DataTable 类中的方法

            【讨论】:

            • 这将防止行被删除,因为只有 DataRowState=Deleted 的 DataRows 会通过 DataAdapter.Update 被删除。您只是将它们从(内存中)DataTable 中删除。
            猜你喜欢
            • 2010-09-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多