27

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

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

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

4

12 回答 12

32

如果您正在针对 sqlserver 数据库运行代码,请
使用此命令

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

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

其他 RDBMS 也支持 TRUNCATE 关键字。

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

于 2012-06-19T14:38:50.253 回答
21

这将允许您清除所有行并保持DataTable.

dt.Rows.Clear();

还有

dt.Clear();

但是,调用( ) 将从 DataTable 中删除列和格式Clear()DataTabledt

根据在 MSDN question 中找到的代码,内部方法由DataRowsCollection, 和DataTable使用不同的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);
            }
        }
    }
}
于 2012-06-19T14:34:44.123 回答
15

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

dt.Rows.Clear()
于 2012-06-19T14:34:23.747 回答
5

这是从 dbms 中的表中删除所有行的最简单方法DataAdapter。但是如果你想在一批中完成,你可以将 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
}

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

于 2012-06-19T14:36:09.503 回答
2

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

DELETE FROM SomeTable
于 2012-06-19T14:31:31.097 回答
1

只需使用dt.Clear()

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

于 2012-06-19T14:37:21.970 回答
0

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

TRUNCATE TABLE tablename

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

于 2012-06-19T14:35:42.233 回答
0

在这里,我们有同样的问题。您可以使用以下代码:

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

于 2013-07-27T09:44:57.147 回答
0

我使用MDaf只需使用以下代码:

DataContext db = new DataContext(ConfigurationManager.ConnectionStrings["con"].ConnectionString);
db.TruncateTable("TABLE_NAME_HERE");
//or
db.Execute("TRUNCATE TABLE TABLE_NAME_HERE ");
于 2015-03-23T09:40:37.570 回答
0

这是一种使用实体固件且没有 SQL 注入或 TSQL 的干净而现代的方法。

using (Entities dbe = new Entities())
{
    dbe.myTable.RemoveRange(dbe.myTable.ToList());
    dbe.SaveChanges();
}
于 2019-11-06T23:20:11.023 回答
-1

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

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

于 2012-06-19T14:32:20.287 回答
-2

Datatable.clear()来自类 DataTable 的方法

于 2012-06-19T14:34:08.450 回答