2012-06-11 8 views
5

Używam asynchronicznego procesu do pobierania danych z długo działającego zapytania SQL. Proces wywołuje procedurę składowaną za pomocą metody SqlCommand.BeginExecuteReader().Z wdzięcznością zakończ długoterminowe zapytanie SQL Server z ADO.NET

Czasami chciałbym zamknąć proces i zakończyć z wdzięcznością wszelkie uruchomione zapytania.

Po kilku testach wydaje się, że wystarczy wywołać SqlConnection.Close(). Na dobrą sprawę, ja również jawnie nazywam SqlConnection.Dispose().

Uruchamiając ślad za SQL Server Profiler, wydaje się, że zapytanie jest zakończony wdzięcznie jak widzę SQL:BatchStarting następnie przez SQL:BatchCompleted po wywołaniu Close().

Czy ktoś może potwierdzić, czy zamknięcie połączenia jest wszystkim, co jest wymagane?

Odpowiedz

2

Wywołanie Close wystarczy tylko kilka uwag:

Przede wszystkim upewnij się, że piszesz bliskich metody wewnątrz wreszcie zablokować, aby zapewnić prawidłową obsługę wyjątków.

Nie trzeba również wywoływać metod SqlConnection.Close i SqlConnection.Dispose, ponieważ oba robią to samo. Metoda usuwania jest dodawana do implementacji wzorca IDisposable i ta metoda wewnętrznie wywołuje metodę SqlConnection.Close, która ma bardziej naturalną nazwę, ponieważ zamykamy połączenia, ale nie wyrzucamy ich :)

Jeśli korzystasz z DataReader, to musisz go zamknąć oraz za każdym razem, gdy chcesz użyć połączenia w innym celu.