2009-10-05 29 views
11

Tôi cần gửi danh sách các lệnh đến SQL 2008 bằng ADO.NET, để thực thi cái này sau cái kia. Tôi có nên tạo một SQLCommand mới cho mỗi SQL mà tôi đang gửi không? Hoặc tái sử dụng cùng một SQLCommand và chỉ thay đổi thuộc tính CommandText? Cảm ơn, NestorTạo mới SQLCommand hoặc tái sử dụng cùng một số

Trả lời

16

SqlCommands khá nhẹ. Bạn luôn an toàn để tạo một cái mới mỗi lần.

Có các biến chứng với các lệnh được parametrized nơi bạn cần xóa và đặt lại tất cả các tham số và tại thời điểm đó, việc tạo lệnh mới là rõ ràng, dễ hiểu và hiệu quả.

Ngoài ra, thường là OK để sử dụng SqlConnection mới mỗi lần. Kết nối tự động, tích hợp trong kết nối là "ma thuật" làm cho hiệu quả này.

tôi sử dụng này:

public void ExecuteQuery(string query) 
{ 
    this.ExecuteQuery(query, null); 
} 

public void ExecuteQuery(string query, Dictionary<string, object> parameters) 
{ 
    using (SqlConnection conn = new SqlConnection(this.connectionString)) 
    { 
     conn.Open(); 

     using (SqlCommand cmd = conn.CreateCommand()) 
     { 
      cmd.CommandText = query; 

      if (parameters != null) 
      { 
       foreach (string parameter in parameters.Keys) 
       { 
        cmd.Parameters.AddWithValue(parameter, parameters[parameter]); 
       } 
      } 

      cmd.ExecuteNonQuery(); 
     } 
    } 
} 
+0

downvoting cho những lời khuyên để đóng và mở lại các kết nối. Làm điều này trong một TransactionScope sẽ ngay lập tức thúc đẩy nó vào một giao dịch DTC, mà nếu không cần thiết làm tổn thương hiệu suất và có thể giới thiệu lỗi nếu DTC không được cấu hình đúng. – Andy

+0

@Andy: Tại sao lại bỏ phiếu khi tôi nói "thường OK"? Hầu hết mọi người sẽ không có vấn đề bạn đang mô tả. –

+1

Nó không phải là "thường OK". Chỉ cần tìm kiếm trên internet cho bao nhiêu lần người đã bất ngờ bị cắn bởi xúc tiến DTC kể từ khi TransactionScope được giới thiệu. Lời khuyên thông thường là sử dụng lại một kết nối duy nhất cho mỗi giao dịch/đơn vị công việc. – Andy

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