2012-03-15 48 views
5

Tôi có chút mã sau đó chạy một câu lệnh SQL:Không thể phát hiện lỗi SQL khi sử dụng ExecuteNonQuery()

int rowsEffected = 0; 
using (SqlConnection dbConnection = new SqlConnection(dbConnectionString)) 
{ 
    try 
    { 
     dbConnection.InfoMessage += new SqlInfoMessageEventHandler(dbConnection_InfoMessage); 
     dbConnection.FireInfoMessageEventOnUserErrors = true; 

     dbConnection.Open(); 


     SqlCommand command = dbConnection.CreateCommand(); 
     command.CommandTimeout = 0; 
     command.CommandText = sqlStatement; 

     rowsEffected = command.ExecuteNonQuery(); 
    } 
    catch (Exception e) 
    { 
     // Handle exception 
    } 
} 

câu lệnh SQL dài chạy có thể báo cáo tiến bộ qua SqlInfoMessageEventHandler bằng cách nâng một lỗi sử dụng RAISERROR với giá trị mức độ nghiêm trọng thích hợp.

Lý do đặt FireInfoMessageEventOnUserMỗi thành true là vì, không có điều này, tất cả các thông báo từ câu lệnh SQL chỉ được xử lý cùng một lúc khi ExecuteNonQuery() trả về. Với giá trị này được đặt thành true, các thông báo tiến trình được xử lý khi chúng được đưa ra bởi câu lệnh SQL.

Như tên của thuộc tính gợi ý, trình xử lý sự kiện cũng kích hoạt khi có lỗi và không chỉ ở mức độ nghiêm trọng cụ thể được dành riêng cho phản hồi tiến độ bởi câu lệnh SQL.

Việc xử lý sự kiện cho phản hồi tiến bộ trông như thế này:

public void dbConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e) 
{ 
    if (e.Errors.Count > 0) 
    { 
     throw new Exception("Something bad happened"); 
    } 

    // Report progress 
} 

Như bạn thấy, tôi có thể phát hiện khi một lỗi xảy ra bởi thuộc tính trong 'e' nhưng ném ngoại lệ không làm gì cả . Tôi đã hy vọng thực hiện sẽ rơi vào khối catch nhưng đây không phải là trường hợp.

Làm cách nào để xác định sau phương thức ExcecuteNonQuery() có xảy ra lỗi không?

TIA

+0

Bạn có thể chạy mã của mình trong một chuỗi và gọi một thread.abort trong hàm đó – SamFisher83

+1

+1: Tôi thích các câu hỏi mà tôi học được điều gì đó chỉ từ việc đọc nó. – NotMe

Trả lời

3

Tôi đã cố gắng tìm ra một công việc xung quanh. Tôi đã thêm một thuộc tính cho lớp có chứa trình xử lý sự kiện. Nếu có lỗi, tôi đã gửi thuộc tính cờ lỗi trong lớp đó, sau đó có thể được đọc sau cuộc gọi tới ExcecuteNonQuery(). Nếu có lỗi thì tôi có thể làm mã dọn dẹp của mình. Cảm ơn vi đa trả lơi.

+0

Vui lòng đánh dấu câu trả lời này là đã trả lời – Marcin

+0

Tôi phải làm điều gì đó tương tự, nhưng trong trường hợp chuỗi bên ngoài phải truy cập đối tượng DB Command, vì vậy tôi đã lưu trữ lệnh cuối cùng được sử dụng để chặn cuộc gọi SQL có thể bị kiểm tra hoặc hủy một chủ đề khác. – Brain2000

1

Sử dụng SqlException lớp thay vì Exception lớp. Và sau đó xem xét e.Errors

+0

Cảm ơn câu trả lời. Tôi không thực sự sử dụng ngoại lệ, tôi đang sử dụng ngoại lệ tùy chỉnh nhưng chỉ vì lợi ích của mã mẫu tôi đã thay đổi thành Ngoại lệ. Bạn không có quyền truy cập vào e.Errors trong mã gọi ExcecuteNonQuery(). – millie

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