Z mojego doświadczenia wynika, że zwykłym powodem, dla którego zapytanie działa szybko w programie SSMS, ale wolno z platformy .NET, są różnice w SET
połączenia -tings. Gdy połączenie zostanie otwarte przez SSMS lub SqlConnection
, kilka SET
polecenia są wydawane automatycznie w celu skonfigurowania środowiska wykonawczego. Niestety SSMS i SqlConnection
mieć inny SET
domyślne.
Jedną wspólną różnicą jest SET ARITHABORT
. Spróbuj wydać SET ARITHABORT ON
jako pierwsze polecenie z twojego kodu .NET.
SQL Profiler może być używany do monitorowania, które SET
polecenia są wydawane zarówno przez SSMS, jak i .NET, więc możesz znaleźć inne różnice.
Poniższy kod pokazuje, jak wydać SET
polecenie, ale pamiętaj, że ten kod nie został przetestowany.
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.
}