一次删除数据表的所有行的快速方法

oMa*_*rix 20 c# datatable

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

foreach (DataRow row in dt.Rows)
{
  row.Delete();
}
TableAdapter.Update(dt);
Run Code Online (Sandbox Code Playgroud)

它运作良好但如果我有很多行需要很多时间.有没有办法一次删除所有行?

Ste*_*eve 26

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

string sqlTrunc = "TRUNCATE TABLE " + yourTableName
SqlCommand cmd = new SqlCommand(sqlTrunc, conn);
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

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

其他RDBMS也支持TRUNCATE关键字.

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


kri*_*gar 14

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

dt.Rows.Clear();
Run Code Online (Sandbox Code Playgroud)

还有

dt.Clear();
Run Code Online (Sandbox Code Playgroud)

但是,调用Clear()DataTable(dt)将删除列,并从数据表格式.

在MSDN问题中找到的每个代码,内部方法由DataRowsCollectionDataTable使用不同的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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很抱歉被该线程中接受的答案愚弄了;-(但感谢您的澄清 (2认同)

Kre*_*reg 10

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

dt.Rows.Clear()
Run Code Online (Sandbox Code Playgroud)

  • 这将阻止删除行,因为只有通过`DataAdapter删除带有[`DataRowState = Deleted`](http://msdn.microsoft.com/en-us/library/system.data.datarowstate.aspx)的DataRows. Update`.您只是从(内存中)DataTable中删除它们. (4认同)

Tim*_*ter 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
}
Run Code Online (Sandbox Code Playgroud)

但是,如果你不是仅仅要删除DataRowsDataTable,你只需要调用DataTable.Clear。这将防止在 dbms 中删除任何行。