2012-06-19 21 views
13

Quiero eliminar todas las filas en una tabla de datos. utilizo algo como esto:Una forma rápida de eliminar todas las filas de una tabla de datos a la vez

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

Funciona bien, pero se necesita una gran cantidad de tiempo si yo tengo mucho filas. ¿Hay alguna manera de eliminar todas las filas a la vez?

+3

¿Qué hay de 'dr.Rows.Clear();'? –

+0

¿Desea eliminarlos de la tabla de datos o desea eliminarlos de su dbms? @ShadowWizard: eso evitaría que se eliminen de dbms. –

+0

@Tim ¿'Update()' del adaptador de tabla no eliminará todas las filas cuando la tabla esté vacía? –

Respuesta

23

Si está ejecutando su código contra una base de datos SQL Server y luego
uso de este comando

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

éste será el método más rápido y eliminará todo, desde su mesa y restablecer el contador a cero identidad.

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

5 años más tarde:
Mirando hacia atrás en esta respuesta tengo que añadir algo. La respuesta anterior es válida solo si está absolutamente seguro sobre el origen del valor en la variable yourTableName. Esto significa que no debe obtener este valor de su usuario porque puede escribir cualquier cosa y esto lleva a problemas de inyección Sql bien descritos en this famous comic strip. Siempre presente a su usuario una opción entre nombres codificados (tablas u otros valores simbólicos) utilizando una interfaz de usuario no editable.

+0

Gracias a todos por sus respuestas rápidas. Utilicé el método anterior para eliminar todas las filas en DBMS y dt.Rows.Clear() después de eso para borrar mi tabla Fue genial. Gracias a todos – oMatrix

+1

@oMatrix, si elimina registros de la tabla de la base de datos (la forma en que Steve sugirió arriba), no necesita hacer dt.Rows.Clear(). –

+0

@AshishGupta: 'dt.Rows.Clear() 'no hace más que eliminar las filas de la DataTable en memoria de todos modos. ** No ** eliminará las filas en' TableAdapter.Update (dt); 'ya que' DataRowState' está 'sin cambios '. –

3

¿Por qué no lo haces en SQL?

DELETE FROM SomeTable 
-1

¿Hay un método Clear() en la clase DataTable ??

Creo que sí. Si hay, usa eso.

-1

Datatable.clear() método de la clase DataTable

+1

Esto evitará que las filas se eliminen, ya que solo DataRows con ['DataRowState = Deleted'] (http://msdn.microsoft.com/en-us/library/system.data.datarowstate.aspx) se eliminan mediante' DataAdapter .Update'. Solo los está eliminando de la DataTable (en memoria). –

7

Como alguien ha mencionado, sólo tiene que utilizar:

dt.Rows.Clear() 
+3

Esto evitará que las filas se eliminen, ya que solo DataRows con ['DataRowState = Deleted'] (http://msdn.microsoft.com/en-us/library/system.data.datarowstate.aspx) se eliminan mediante' DataAdapter .Update'. Solo los está eliminando de la DataTable (en memoria). –

6

Esto le permitirá borrar todas las filas y mantener el formato de la DataTable.

dt.Rows.Clear(); 

Hay también

dt.Clear(); 

Sin embargo, llamando Clear() en la DataTable (dt) eliminará las columnas y el formato de la DataTable.

por code found in an MSDN question, un método interno es llamado por tanto el DataRowsCollection y DataTable con un diferente boolean parámetro:

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); 
      } 
     } 
    } 
} 
+0

Tanto DataTable.Clear() como Rows.Clear() eliminarán todas las filas de la tabla de datos pero no las columnas, consulte https://social.msdn.microsoft.com/Forums/en-US/be8066c7-0415-4977. -9277-e73da98198b6/difference-between-datatableclear-and-datatablerowsclear? Forum = csharplanguage –

+0

@CarlosLiu ¡Gracias por el enlace! Pero de acuerdo con el código que se muestra en el enlace que compartió (y lo agregué a mi respuesta aquí), el método DataTable Clear borrará las columnas. Solo Rows.Clear() mantendrá las columnas. – krillgar

+1

lo siento ser engañado por la respuesta aceptada en ese hilo ;-(pero gracias por su aclaración –

0

Si usted está realmente preocupado por la velocidad y no está preocupado por los datos que puede hacer un truncado . Pero esto supone que su DataTable está en una base de datos y no solo en un objeto de memoria.

TRUNCATE TABLE tablename 

La diferencia es que esto elimina todas las filas sin registrar la eliminación de filas hace que la transacción sea más rápida.

3

Esa es la manera más fácil de eliminar todas las filas de la tabla en dbms a través de DataAdapter. Pero si quiere hacerlo en un solo lote, puede configurar el DataAdapter's UpdateBatchSize en 0 (ilimitado).

Otra manera sería utilizar un simple SqlCommand con 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 
} 

Pero si en lugar de sólo desea quitar el DataRows del DataTable, sólo hay que llamar DataTable.Clear. Eso evitaría que se eliminen las filas en dbms.

+0

Gracias por su código útil. Es una buena manera también. – oMatrix

+0

Usando 'Using' es probablemente la forma más amigable – msysmilu

1

sólo tiene que utilizar dt.Clear()

También usted puede configurar su TableAdapter/adaptador de datos para borrar antes de que se llena de datos.

+0

Va a borrar el DataTable pero también evita que se eliminen las filas en la base de datos (lo que OP quiere es imho). –

0

Here tenemos la misma pregunta. Usted puede utilizar el siguiente código:

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

Pero antes de tener que importar siguiente código a su proyecto:

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

Ésta es la parte específica del código que puede eliminar todas las filas es una tabla:

DELETE FROM [tablenamehere] 

Esta debe ser su nombre de la tabla: tablenamehere - Esto puede eliminar todas las filas en la tabla: DELETE FROM

0

I utilizando MDaf sólo tiene que utilizar este código:

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