2012-04-07 12 views
33

ich derzeit an einem C# Projekt arbeitete und ich einen Einsatz Abfrage leite die auch zugleich ein ausgewähltes tut, zum Beispiel:Erhalten betroffene Zeilen auf ExecuteNonQuery

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

Gibt es eine Weise, die ich sehen kann, wie Viele Zeilen wurden während dieser Abfrage eingefügt?

Antwort

69

ExecuteNonQuery - Gibt die Anzahl der betroffenen Zeilen zurück.

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

ich das tue, und aus irgendeinem Grunde, obwohl eine neue Zeile erstellt wurde meine Tabelle gibt diese Methode -1 zurück. Sollte ich auch etwas in meiner SQL-Anweisung haben? – JoeManiaci

+1

SqlCommand.ExecuteNonQuery() gibt -1 zurück, wenn Sie Einfügen/Aktualisieren/Löschen ausführen Siehe https://blogs.msdn.microsoft.com/spike/2009/01/27/sqlcommand-executenonquery-returns-1-when-doing-insert -update-delete/ –

+1

Dies funktioniert nicht immer wie erwartet. Bei einem UPDATE ist die Anzahl der zurückgegebenen Zeilen die Anzahl der Zeilen, die * geändert werden konnten * und nicht die Anzahl der Zeilen, die tatsächlich geändert wurden. Nehmen wir an, Sie machen ein UPDATE, bei dem bis zu 50 Zeilen betroffen sein könnten. Bei 35 dieser Zeilen bewirkt das UPDATE jedoch keine Änderung der Daten. Die Daten ändern sich nur für 15 Zeilen der 50 möglichen Zeilen. In diesem Fall würde man hoffen, dass "15" der zurückgegebene Wert ist, aber stattdessen der zurückgegebene Wert 50 ist, die Gesamtzahl der Zeilen. – Ian

12

Wenn Sie die SQL aus Ihrer Frage in einer SqlCommand ausführen und überprüfen Sie den Rückgabewert ExecuteNonQuery sollte es Ihnen sagen, wie viele Datensätze betroffen waren.

Vom documentation:

Rückgabewert
Typ: System.Int32
Die Anzahl der betroffenen Zeilen.

0

Wenn Sie einen Großteil der ExecuteNonQuery() laufen, und sich verpflichten, sie alle in einmal, können Sie die Anzahl der gesamten Änderungen nach der Verbindung erhalten, indem Sie den Rückgabewert von lesen „SELECT total_changes();“

Die Funktion die gesamten Änderungen zu erhalten:

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

es in einer anderen Funktion verwenden:

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