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
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: 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