2012-04-07 69 views
33

Actualmente estoy trabajando en un proyecto de C# y estoy ejecutando una consulta de inserción, que también hace un selecto al mismo tiempo, por ejemplo:Obtener filas afectadas en ExecuteNonQuery

INSERT INTO table (SELECT * FROM table WHERE column=date) 

¿Hay alguna manera de ver cómo muchas filas se insertaron durante esta consulta?

Respuesta

69

ExecuteNonQuery - devuelve el número de filas afectadas.

SqlCommand comm; 
// other codes 
int numberOfRecords = comm.ExecuteNonQuery(); 
+2

que estoy haciendo esto, y por alguna razón a pesar de que una nueva fila se creó en mi table, este método devuelve -1. ¿Debo también tener algo en mi declaración SQL? – JoeManiaci

+1

SqlCommand.ExecuteNonQuery() devuelve -1 cuando se hace Insert/Update/Delete. Consulte https://blogs.msdn.microsoft.com/spike/2009/01/27/sqlcommand-executenonquery-returns-1-would-doing-insert -update-delete/ –

+1

Esto no siempre funciona como uno podría esperar. Para una ACTUALIZACIÓN, el número de filas devueltas es el número de filas que * podría * haberse cambiado en lugar de la cantidad de filas que realmente se cambiaron. Digamos que está realizando una ACTUALIZACIÓN en la que se pueden ver afectadas hasta 50 filas. Sin embargo, en 35 de esas filas, la ACTUALIZACIÓN no causa cambios en los datos. Los datos cambian solo para 15 filas de las 50 posibles filas. En este caso, uno esperaría que "15" sea el valor devuelto, pero en cambio el valor devuelto es 50, el número total de filas. – Ian

12

Si ejecuta el SQL de su pregunta en un SqlCommand y comprueba el valor de retorno de ExecuteNonQuery, debe indicar cuántos registros se vieron afectados.

Desde el documentation:

Valor devuelto
Tipo: System.Int32
El número de filas afectadas.

0

Si ejecuta un grueso de ExecuteNonQuery(), y se compromete a todos en una sola vez, se puede obtener el número total de cambios después de la conexión por leer el valor de retorno de "SELECT TOTAL_CHANGES();"

La función para obtener los cambios totales:

public static long GetTotalChanges(SQLiteConnection m_dbConnection) 
     { 
      string sql = "SELECT total_changes();"; 
      using (SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection)) 
      { 
       using (SQLiteDataReader reader = command.ExecuteReader()) 
       { 
        reader.Read(); 
        return (long)reader[0]; 
       } 
      } 
     } 

usarlo en otra función:

public static long MyBulkInserts() 
     { 
      using (SQLiteConnection m_dbConnection = new SQLiteConnection()) 
      { 
       m_dbConnection.Open(); 
       using (var cmd = new SQLiteCommand(m_dbConnection)) 
       { 
        using (var transaction = m_dbConnection.BeginTransaction()) 
        { 
         //loop of bulk inserts 
         { 
          cmd.ExecuteNonQuery(); 
         } 
         transaction.Commit(); 
        } 
       } 
       return GetTotalChanges(m_dbConnection); 
      } 
     } 
Cuestiones relacionadas