web-dev-qa-db-fra.com

Un moyen rapide pour supprimer toutes les lignes d'un datatable à la fois

Je veux supprimer toutes les lignes d'un datatable . J'utilise quelque chose comme ceci:

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

Cela fonctionne bien mais cela prend beaucoup de temps si j'ai beaucoup de lignes .. Est-ce qu'il y a un moyen de supprimer toutes les lignes à la fois?

15
oMatrix

Si vous exécutez votre code sur une base de données sqlserver,
utilisez cette commande

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

ce sera la méthode la plus rapide et supprimera tout de votre table et réinitialisera le compteur d'identité à zéro.

Le mot clé TRUNCATE est également pris en charge par d'autres SGBDR.

5 ans plus tard:
En repensant à cette réponse, je dois ajouter quelque chose. La réponse ci-dessus n’est valable que si vous êtes absolument sûr de la source de la valeur dans la variable yourTableName. Cela signifie que vous ne devriez pas obtenir cette valeur de votre utilisateur car il peut taper n'importe quoi, ce qui entraîne des problèmes d'injection SQL bien décrits dans cette célèbre bande dessinée . Présentez toujours à votre utilisateur le choix entre des noms codés en dur (tables ou autres valeurs symboliques) à l'aide d'une interface utilisateur non modifiable.

26
Steve

Cela vous permettra d'effacer toutes les lignes et de conserver le format de la variable DataTable.

dt.Rows.Clear();

Il y a aussi

dt.Clear();

Cependant, l'appel de Clear() sur la DataTable (dt) supprimera les colonnes et la mise en forme du DataTable.

Per code trouvé dans une question MSDN , une méthode interne est appelée par les variables DataRowsCollection et DataTable avec un paramètre boolean différent:

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);
            }
        }
    }
}
10
krillgar

Comme quelqu'un l'a mentionné, utilisez simplement:

dt.Rows.Clear()
9
Kreg

C'est le moyen le plus simple de supprimer toutes les lignes de la table dans dbms via DataAdapter. Mais si vous voulez le faire en un seul lot, vous pouvez définir la valeur UpdateBatchSize du DataAdapter sur 0 (illimité).

Une autre solution consisterait à utiliser une simple SqlCommand avec 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
}

Mais si vous souhaitez uniquement supprimer la DataRows de la DataTable, vous devez simplement appeler DataTable.Clear . Cela empêcherait la suppression de toutes les lignes dans les dbms.

4
Rango

Pourquoi ne le faites-vous pas simplement en SQL?

DELETE FROM SomeTable
2
Kell

Il suffit d'utiliser dt.Clear()

Vous pouvez également définir votre TableAdapter/DataAdapter pour qu'il s'efface avant qu'il ne se remplisse de données.

1
dupe

Si vous êtes vraiment préoccupé par la vitesse et non par les données, vous pouvez effectuer une opération Truncate. Mais cela suppose que votre DataTable se trouve sur une base de données et pas simplement un objet de mémoire.

TRUNCATE TABLE tablename

La différence est que cela supprime toutes les lignes sans consigner les suppressions de ligne, ce qui accélère la transaction.

0
Jake1164

Ici nous avons la même question. Vous pouvez utiliser le code suivant:

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

Mais avant de devoir importer le code suivant dans votre projet:

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

Ceci est la partie spécifique du code qui peut supprimer toutes les lignes est une table:

DELETE FROM [tablenamehere]

Ce doit être votre nom de table: tablenamehere - Ceci peut supprimer toutes les lignes de la table: DELETE FROM

0
user2501518

J'utilise MDaf utilise simplement ce code:

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