Theo kinh nghiệm của tôi, lý do thông thường tại sao truy vấn chạy nhanh trong SSMS nhưng chậm từ .NET là do sự khác biệt trong SET
của kết nối -cốt. Khi kết nối được mở bằng SSMS hoặc SqlConnection
, một loạt SET
các lệnh được tự động đưa ra để thiết lập môi trường thực thi. Rất tiếc, SSMS và SqlConnection
có SET
khác nhau mặc định.
Một điểm khác biệt phổ biến là SET ARITHABORT
. Thử phát hành SET ARITHABORT ON
là lệnh đầu tiên từ mã .NET của bạn.
SQL Profiler có thể được sử dụng để theo dõi SET
nào các lệnh được phát hành bởi cả SSMS và .NET nên bạn có thể tìm thấy các điểm khác biệt khác.
Đoạn mã sau minh họa cách phát hành một SET
nhưng lưu ý rằng mã này chưa được kiểm tra.
using (SqlConnection conn = new SqlConnection("<CONNECTION_STRING>")) {
conn.Open();
using (SqlCommand comm = new SqlCommand("SET ARITHABORT ON", conn)) {
comm.ExecuteNonQuery();
}
// Do your own stuff here but you must use the same connection object
// The SET command applies to the connection. Any other connections will not
// be affected, nor will any new connections opened. If you want this applied
// to every connection, you must do it every time one is opened.
}