Una forma rápida de eliminar todas las filas de una tabla de datos a la vez

Resuelto oMatrix asked hace 12 años • 13 respuestas

Quiero eliminar todas las filas de una tabla de datos. Yo uso algo como esto:

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

Funciona bien pero lleva mucho tiempo si tengo muchas filas. ¿Hay alguna forma de eliminar todas las filas a la vez?

oMatrix avatar Jun 19 '12 21:06 oMatrix
Aceptado

Si está ejecutando su código en una base de datos SQLServer,
utilice este comando

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

Este será el método más rápido y eliminará todo de su mesa y restablecerá el contador de identidad a cero.

La palabra clave TRUNCATE también es compatible con otros RDBMS.

5 años después:
mirando hacia atrás en esta respuesta, necesito agregar algo. La respuesta anterior es buena sólo si está absolutamente seguro de la fuente del valor en la variable yourTableName . Esto significa que no deberías obtener este valor de tu usuario porque puede escribir cualquier cosa y esto lleva a problemas de inyección Sql bien descritos en esta famosa tira cómica . Presente siempre a su usuario la posibilidad de elegir entre nombres codificados (tablas u otros valores simbólicos) utilizando una interfaz de usuario no editable.

Steve avatar Jun 19 '2012 14:06 Steve

Esto le permitirá borrar todas las filas y mantener el formato del archivo DataTable.

dt.Rows.Clear();

También hay

dt.Clear();

Sin embargo, al llamar Clear()a DataTable( dt) se eliminarán las columnas y el formato de la tabla de datos.

Según el código que se encuentra en una pregunta de MSDN , se llama a un método interno tanto mediante DataRowsCollectioncomo con un parámetro DataTablediferente :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);
            }
        }
    }
}
krillgar avatar Jun 19 '2012 14:06 krillgar

Como alguien mencionó, simplemente use:

dt.Rows.Clear()
Kreg avatar Jun 19 '2012 14:06 Kreg