2012-04-07 9 views
33

Attualmente sto lavorando su un progetto C# e io sono in esecuzione una query di inserimento che fa anche un prescelto, allo stesso tempo, ad esempio:Ottenere righe coinvolte sul ExecuteNonQuery

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

C'è un modo per vedere come molte righe sono state inserite durante questa query?

risposta

69

ExecuteNonQuery - restituisce il numero di righe interessate.

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

sto facendo questo, e per qualche ragione, anche se una nuova riga è stato creato nel mio tabella, questo metodo restituisce -1. Dovrei avere anche qualcosa nella mia istruzione sql? – JoeManiaci

+1

SqlCommand.ExecuteNonQuery() restituisce -1 quando si esegue Insert/Update/Delete Vedere https://blogs.msdn.microsoft.com/spike/2009/01/27/sqlcommand-executenonquery-returns-1-when-doing-insert -update-delete/ –

+1

Questo non sempre funziona come ci si potrebbe aspettare. Per un UPDATE il numero di righe restituite è il numero di righe che * potrebbe * essere stato modificato anziché il numero di righe effettivamente modificate. Supponiamo che stiate facendo un UPDATE in cui possono essere interessate fino a 50 righe. Tuttavia, per 35 di queste righe, UPDATE non causa la modifica di alcun dato. I dati cambiano solo per 15 righe delle 50 possibili righe. In questo caso si spera che "15" sia il valore restituito ma invece il valore restituito è 50, il numero totale di righe. – Ian

12

Se si esegue l'SQL dalla domanda in un SqlCommand e si controlla il valore restituito di ExecuteNonQuery, è necessario indicare il numero di record interessati.

Dal documentation:

Return Value
Tipo: System.Int32
Il numero di righe interessate.

0

Se si esegue una massa di ExecuteNonQuery(), e li impegnano in una volta, è possibile ottenere il numero di cambiamenti totali dopo connessione leggere il valore restituito da "SELECT TOTAL_CHANGES();"

La funzione di ottenere il totale cambia:

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]; 
       } 
      } 
     } 

utilizzarlo in un'altra funzione:

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); 
      } 
     } 
Problemi correlati