2010-02-24 35 views
9

Tôi muốn cập nhật nhiều hàng như dưới đâyLàm thế nào để thực hiện cập nhật hàng loạt trong Sql qua C# mã

update mytable set s_id = {0} where id = {1} 

(Đây s_id được đánh giá dựa trên một số logic phức tạp).
Vì lý do hiệu suất, các cập nhật sẽ xảy ra theo lô. Có cách nào để lô các báo cáo cập nhật và thực hiện các lô thông qua các câu lệnh thực hiện đơn? Tôi biết trong JAVA chúng ta có thể làm điều này thông qua JDBC. Có cách nào tương tự trong C#?

Cảm ơn trước

Trả lời

18

Có, bạn có thể sử dụng SqlDataAdapter.

SqlDataAdapter có các thuộc tính InsertCommandUpdateCommand cho phép bạn chỉ định một SQLCommand để sử dụng để chèn hàng mới vào cơ sở dữ liệu và SqlCommand để cập nhật các hàng trong cơ sở dữ liệu tương ứng.

Sau đó, bạn có thể chuyển một DataTable đến phương thức Update của dữ liệu, và nó sẽ thực hiện các câu lệnh cho máy chủ - cho các hàng trong DataTable là các hàng mới, nó thực hiện lệnh INSERT, cho các hàng đã sửa đổi. lệnh UPDATE.

Bạn có thể xác định kích thước lô bằng thuộc tính UpdateBatchSize.

Cách tiếp cận này cho phép bạn xử lý khối lượng lớn dữ liệu và cho phép bạn xử lý lỗi một cách độc đáo theo nhiều cách khác nhau, tức là nếu gặp phải lỗi cập nhật cụ thể, bạn có thể yêu cầu KHÔNG ném ngoại lệ với các bản cập nhật còn lại bằng cách đặt thuộc tính ContinueUpdateOnError.

0

Tạo một bộ những thông tin cập nhật (với id điền vào), tách chúng bằng dấu chấm phẩy trong một chuỗi, thiết lập chuỗi kết quả về tài sản CommandText của SqlCommand, sau đó gọi ExecuteNonQuery().

2

Sử dụng một StringBuilder (System.Text.StringBuilder) để xây dựng Sql của bạn, chẳng hạn như:

StringBuilder sql = new StringBuilder(); 
int batchSize = 10; 
int currentBatchCount = 0; 
SqlCommand cmd = null; // The SqlCommand object to use for executing the sql. 
for(int i = 0; i < numberOfUpdatesToMake; i++) 
{ 
    int sid = 0; // Set the s_id here 
    int id = 0; // Set id here 
    sql.AppendFormat("update mytable set s_id = {0} where id = {1}; ", sid, id); 

    currentBatchCount++; 
    if (currentBatchCount >= batchSize) 
    { 
    cmd.CommandText = sql.ToString(); 
    cmd.ExecuteNonQuery(); 
    sql = new StringBuilder(); 
    currentBatchCount = 0; 
    } 
} 
+3

Có thể vì các cuộc tấn công SQL Injection có thể xảy ra với mã của bạn – GvS

+1

Không nếu chỉ số nguyên của nó –

+1

@GvS SQL Injection không liên quan khi không có đầu vào không đáng tin cậy. Bất kỳ ai có khả năng thay đổi 'int id = 0' cũng có thể dễ dàng thay đổi toàn bộ truy vấn. – Dan

9

Có, bạn có thể xây dựng một lệnh plain-text SQL (tham số cho an ninh), như thế này:

SqlCommand command = new SqlCommand(); 
// Set connection, etc. 
for(int i=0; i< items.length; i++) { 
    command.CommandText += string.Format("update mytable set [email protected]_id{0} where id = @id{0};", i); 
    command.Parameters.Add("@s_id" + i, items[i].SId); 
    command.Parameters.Add("@id" + i, items[i].Id); 
} 
command.ExecuteNonQuery(); 
+0

Tôi thích cách tiếp cận này. Dễ thực hiện/gỡ lỗi hơn SqlDataAdapter cho mục đích của tôi. – Dan

+1

Chỉ để nhắc bạn bị giới hạn trong 2100 thông số! – Arvand

+0

@Arvand Bạn giải quyết vấn đề này bằng cách nào? – Arvayne

Các vấn đề liên quan