2012-04-07 5 views
33

나는 현재 C# 프로젝트에서 일하고 내가 예를 들어, 같은 시간에 선택을하지 삽입 쿼리를 실행하고 있습니다에 영향을받는 행을 얻기 이 쿼리 중에 많은 행이 삽입 되었습니까?ExecuteNonQuery는

답변

69

ExecuteNonQuery - 영향을받는 행 수를 반환합니다.

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

, 새로운 행이 만들어졌습니다에도 불구하고 어떤 이유를 내 이 메소드는 -1을 리턴합니다. SQL 문에서 뭔가를 사용해야합니까? – JoeManiaci

+1

삽입/업데이트/삭제를 수행 할 때 SqlCommand.ExecuteNonQuery()가 -1을 반환합니다. https://blogs.msdn.microsoft.com/spike/2009/01/27/sqlcommand-executenonquery-returns-1-when-doing-insert -update-delete/ –

+1

예상대로 작동하지 않을 수도 있습니다. 업데이트의 경우 반환되는 행 수는 실제로 변경된 행 수가 아닌 * 변경 될 수있는 행 수입니다. 최대 50 개의 행에 영향을 줄 수있는 업데이트를한다고 가정 해 보겠습니다. 그러나 이러한 행 중 35 개에 대해서는 UPDATE로 인해 데이터가 변경되지 않습니다. 50 개의 가능한 행 중 15 개의 행에 대해서만 데이터가 변경됩니다. 이 경우 "15"가 반환 값이 되길 기대하지만 반환 값은 총 행 수인 50입니다. – Ian

12

질문에서 SqlCommand의 SQL을 실행하고 ExecuteNonQuery의 반환 값을 확인하면 영향을받은 레코드 수를 알려야합니다. documentation에서

:

반환 값
유형 : 선택 System.Int32
영향을받는 행의 수입니다.

0

당신이 ExecuteNonQuery는()의 대부분을 실행하고 한 번에 모두 커밋 경우의 반환 값을 읽어하여 접속 후 전체 변경 횟수를 얻을 수 있습니다 ") (TOTAL_CHANGES를 선택합니다"

총 변화 얻을 수있는 기능 :

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

하는 다른 함수에서 사용 :

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); 
      } 
     } 
나는이 일을 해요