2012-04-07 2 views
33

В настоящее время я работаю над C# проекта, и я бег запроса вставки, которая также делает выбор в то же время, например:Получить затронутую строку на ExecuteNonQuery

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

Есть ли способ, что я могу видеть, как во время этого запроса было вставлено много строк?

ответ

69

ExecuteNonQuery - возвращает количество затронутых строк.

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

Я делаю это, и по какой-то причине, даже если новая строка была создана в моем table, этот метод возвращает -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

Это не всегда работает так, как можно было бы ожидать. Для UPDATE количество возвращенных строк - это количество строк, которые * могут * были изменены, а не количество строк, которые были фактически изменены. Предположим, вы делаете UPDATE, где может быть затронуто до 50 строк. Однако для 35 из этих строк UPDATE не приводит к изменению данных. Данные изменяются только для 15 строк из 50 возможных строк. В этом случае можно было бы надеяться, что «15» будет возвращенным значением, но вместо этого возвращаемое значение равно 50, общее количество строк. – Ian

12

Если вы запустите SQL из своего вопроса в SqlCommand и проверьте возвращаемое значение ExecuteNonQuery, он должен сообщить вам, сколько записей было затронуто.

От documentation:

Возвращаемое значение
Тип: System.Int32
Число затронутых строк.

0

Если запустить большую часть ExecuteNonQuery(), и их все совершают один раз, вы можете получить общее количество изменений после соединения пути чтения возвращаемого значения из «SELECT 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); 
      } 
     } 
Смежные вопросы