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();

これは最速の方法であり、テーブルからすべてを削除し、ID カウンターをゼロにリセットします。

TRUNCATE キーワードは、他の RDBMS でもサポートされています。

5年後:
この回答を振り返って、何かを追加する必要があります。上記の答えは、 yourTableName変数の値のソースについて完全に確信がある場合にのみ有効です。これは、ユーザーからこの値を取得してはならないことを意味します。ユーザーは何でも入力できるため、この有名なコミック ストリップで説明されている SQL インジェクションの問題が発生する可能性があります。編集不可能な UI を使用して、ハードコーディングされた名前 (テーブルまたはその他の記号値) の選択肢を常にユーザーに提示します。

于 2012-06-19T14:38:50.253 に答える
21

これにより、すべての行をクリアし、の形式を維持できますDataTable

dt.Rows.Clear();

もあります

dt.Clear();

Clear()ただし、DataTable( )を呼び出すdtと、DataTableから列と書式が削除されます。

MSDNの質問で見つかったコードごとに、内部メソッドがとの両方で呼び出され、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です。ただし、1 つのバッチで実行する場合は、DataAdapterUpdateBatchSizeを 0 (無制限) に設定できます。

もう 1 つの方法は、単純なSqlCommandCommandTextを使用すること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

速度を本当に気にし、データを気にしない場合は、Truncate を実行できます。ただし、これは、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 に答える
-1

DataTable クラスに Clear() メソッドはありますか??

あると思います。あるなら、それを使ってください。

于 2012-06-19T14:32:20.287 に答える
-2

Datatable.clear()クラスDataTableのメソッド

于 2012-06-19T14:34:08.450 に答える