2011-10-20 5 views
13

Chciałbym dać użytkownikowi możliwość anulowania uruchomionego zapytania. Zapytanie jest naprawdę powolne. (Optymalizacja zapytań jest poza tym punktem). Wynika to głównie z mojej ciekawości.Czy kwerendy serwera sql mogą być naprawdę anulowane/zabite?

MSDN mówi:

Jeśli nie ma nic, aby anulować, nic nie występuje. Jeśli jednak w procesie istnieje polecenie , a próba anulowania nie powiedzie się, nie wygenerowano żadnego wyjątku .

  • Cmd - SQLCommand
  • DA - DataAdapter
  • Conn - SqlConnection
  • CurrentSearch - Temat
  • LongQuery - Singleton

Oto co mam:

var t = new Thread(AbortThread); 
t.Start(); 

void AbortThread() 
{ 
    LongQuery.Current.Cmd.Cancel(); 
    LongQuery.Current.Cmd.Dispose(); 
    LongQuery.Current.DA.Dispose(); 
    LongQuery.Current.Conn.Close(); 
    LongQuery.Current.Conn.Dispose(); 
    LongQuery.Current.Cmd = null; 
    LongQuery.Current.DA = null; 
    LongQuery.Current.Conn = null; 
    CurrentSearch.Abort(); 
    CurrentSearch.Join(); 
    CurrentSearch = null; 
} 

Zauważyłem, że blokuje się CurrentSearch.Abort(), dlatego zawinąłem go w nitkę, co prawdopodobnie oznacza, że ​​wątek nadal działa.

Czy jest coś jeszcze, co mogę zrobić, aby anulować zapytanie? Czy rzeczywiście można anulować tak długie zapytanie z .NET?

+1

jest zapisywanie danych kwerendy, albo po prostu go czytać? –

+0

@BrianKnight Po prostu czytanie z wielu widoków. – Candide

Odpowiedz

9

jeśli naprawdę absolutnie chcą go zabić dla dobrego wykorzystania tego podejścia:

  • składować identyfikator sesji tuż przed rozpoczęciem długo działa zapytania dzwoniąc SELECT @@SPID AS 'SESSIONID' na tym samym połączeniu

gdy chcesz go zabić:

  • otworzyć nowe połączenie DB
  • wydać KILL polecenia dla tej sesji ID
    uważaj jak dokumentacji MSDN stwierdza trzeba pozwolenie ALTER ANY CONNECTION to zrobić
+3

Polecenie KILL wymaga podwyższonego uprawnienia - ZMIEŃ KAŻDE POŁĄCZENIE. –

+0

prawda - ale to AFAIK to jedyne 100% rozwiązanie tego pytania ... – Yahia

+0

Fantastyczne! Tak było. Dziękuję, Yahio! – Candide

-2

Tak, możesz zabić proces z .NET. Here is an example. Pamiętaj, że będziesz potrzebować odpowiednich uprawnień i musisz dowiedzieć się, o jaki proces chodzi. Nie mam szybkiej próby określenia, w jakim procesie działa twoje zapytanie.

Przykładowo przerywanie wątku, ale to nie znaczy, że praca na SQL Server została zakończona. Jeśli myślisz o tym w następujący sposób: kiedy przechodzisz przez strefę złej komórki, a połączenie spada, jeśli mama/żona/przyjaciółka brzęczała, czy oni natychmiast przestają mówić? Jest to analogia do przerwania wątku, przynajmniej w przypadku pracy z serwerem bazy danych.

+5

Próbuje zabić trwające zapytanie, a nie proces. –

Powiązane problemy