2012-04-07 30 views
33

Tôi hiện đang làm việc trên một dự án C# và tôi chạy một truy vấn chèn mà cũng làm một lựa chọn cùng một lúc, ví dụ:Nhận hàng bị ảnh hưởng trên ExecuteNonQuery

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

Có cách nào tôi có thể xem như thế nào nhiều hàng đã được chèn trong truy vấn này?

Trả lời

69

ExecuteNonQuery - trả về số hàng bị ảnh hưởng.

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

tôi đang làm điều này, và vì một lý do mặc dù một hàng mới đã được tạo ra trong tôi bảng, phương thức này trả về -1. Tôi cũng nên có một cái gì đó trong câu lệnh sql của tôi? – JoeManiaci

+1

SqlCommand.ExecuteNonQuery() trả về -1 khi thực hiện Chèn/Cập nhật/Xóa Xem https://blogs.msdn.microsoft.com/spike/2009/01/27/sqlcommand-executenonquery-returns-1-when-doing-insert -update-delete/ –

+1

Điều này không phải lúc nào cũng hoạt động như mong đợi. Đối với một UPDATE số hàng trả về là số hàng * có thể * đã được thay đổi thay vì số hàng thực sự đã thay đổi. Giả sử bạn đang thực hiện CẬP NHẬT, nơi tối đa 50 hàng có thể bị ảnh hưởng. Tuy nhiên đối với 35 trong số những hàng này, UPDATE không gây ra bất kỳ dữ liệu nào được thay đổi. Dữ liệu chỉ thay đổi 15 hàng trong số 50 hàng có thể. Trong trường hợp này, người ta hy vọng rằng "15" sẽ là giá trị trả lại nhưng thay vào đó giá trị trả về là 50, tổng số hàng. – Ian

12

Nếu bạn chạy SQL từ câu hỏi của mình trong một SqlCommand và kiểm tra giá trị trả về của ExecuteNonQuery, nó sẽ cho bạn biết số lượng bản ghi bị ảnh hưởng.

Từ documentation:

Return Value
Loại: System.Int32
Số hàng bị ảnh hưởng.

0

Nếu bạn chạy một số lượng lớn của ExecuteNonQuery(), và cam kết tất cả chúng trong một lần, bạn có thể nhận được số tổng thay đổi sau khi kết nối bằng cách đọc các giá trị trả về từ "SELECT TOTAL_CHANGES();"

Chức năng để có được tổng số thay đổi:

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

Sử dụng nó trong chức năng khác:

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); 
      } 
     } 
Các vấn đề liên quan