2010-06-25 42 views
5

Khi tôi sử dụng SqlCommandBuilder để đẩy cập nhật/chèn/xóa vào máy chủ, tôi có cần gọi .GetUpdateCommand(), .GetInsertCommand().GetDeleteCommand() không?SqlCommandBuilder.GetUpdateCommand() có cần phải được gọi trước khi sử dụng SqlDataAdpater.Update() không?

using (var adapter = new SqlDataAdapter("select * from MyTable", _connection)) 
using (var builder = new SqlCommandBuilder(adapter)) 
{ 
    adapter.Fill(dt); 

    //Magic happens   

    builder.GetUpdateCommand(); //is this line necessary 
    builder.GetInsertCommand(); //is this line necessary 
    adapter.Update(dt); 
} 

Tôi đã thấy conflictingexamples trên đúng thủ tục phải làm là gì. Tôi biết nó hoạt động mà không có nó nhưng tôi không biết nếu nó đã làm một cái gì đó đặc biệt đằng sau hậu trường. Đây có phải là điều cần thiết hay nó là lập trình giáo phái hàng hóa?

Trả lời

5

Tôi đã thực hiện một số kiểm tra trên cơ sở dữ liệu thử nghiệm của mình để xem liệu tôi có thể đưa ra một kịch bản có lỗi xảy ra nếu tôi KHÔNG gọi GetInsertCommand(). Hóa ra nó có thể xảy ra, trong trường hợp của tôi, nó xảy ra khi tôi cập nhật một vài bảng khác nhau trong một cơ sở dữ liệu.

Vì lý do nào đó khi cập nhật bảng thứ 4 của tôi, nó không thể chèn chính xác. Điều này làm tôi lo lắng, vì vậy tôi quyết định làm một ít nghiên cứu hơn, mang lại cho tôi here. Hãy chú ý đến:

Sau khi câu lệnh Transact-SQL được tạo lần đầu tiên, ứng dụng phải gọi rõ ràng là RefreshSchema nếu nó thay đổi câu lệnh theo bất kỳ cách nào. Nếu không, GetInsertCommand vẫn sẽ sử dụng thông tin từ câu lệnh trước, điều này có thể không chính xác.

Điều này cho tôi biết rằng nó CÓ THỂ hoạt động mà không cần gọi, nhưng tốt hơn nên gọi nó. Tôi đã cố gắng tìm lý do tại sao đôi khi nó làm việc, và đôi khi nó không. Nhưng tôi đã không thể tìm ra nó hoàn toàn.

+0

Không cần phải đặt chúng, tôi đã tự hỏi tại sao một số ví dụ lại làm. (Tôi chạy mã của tôi mà không gọi các lệnh get và nó đã cập nhật máy chủ của tôi tốt.) –

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