2011-10-20 12 views
13

Vorrei dare a un utente la possibilità di annullare una query in esecuzione. La query è molto lenta. (L'ottimizzazione delle query è oltre il punto.) Questo è principalmente per mia curiosità.Le query del server SQL possono essere realmente annullate/eliminate?

MSDN dice:

Se non c'è nulla da annullare, non accade nulla. Tuttavia, se è in esecuzione un comando e il tentativo di annullamento non riesce, non viene generata alcuna eccezione .

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

Ecco quello che ho:

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; 
} 

Ho notato che CurrentSearch.Abort() stava bloccando, è per questo che l'ho avvolto in un thread, il che probabilmente significa che il thread sta ancora funzionando.

Infine, c'è qualcos'altro che posso fare per cancellare una query? È effettivamente possibile cancellare una query così lunga da .NET?

+1

è la scrittura dei dati della query, o semplicemente leggerlo? –

+0

@BrianKnight Basta leggere da più viste. – Candide

risposta

9

se davvero vuole assolutamente uccidere per un buon uso di questo approccio:

  • negozio di distanza l'ID di sessione a destra prima di iniziare la query di lunga durata chiamando SELECT @@SPID AS 'SESSIONID' sulla stessa connessione

quando si vuole ucciderlo:

  • Aprire una nuova connessione DB
  • emettere un comando KILL per tale ID di sessione
    state attenti perché la documentazione MSDN indica è necessario il permesso di fare questo ALTER ANY CONNECTION
+3

Il comando KILL richiede un'autorizzazione elevata - ALTER NESSUNA CONNESSIONE. –

+0

true - ma è AFAIK l'unica soluzione al 100% alla domanda ... – Yahia

+0

Fantastico! Questo è stato. Grazie Yahia! – Candide

-2

Sì, è possibile interrompere un processo da .NET. Here is an example. Nota che avrai bisogno di permessi adeguati e devi capire il processo in questione. Non ho un rapido esempio di determinare quale processo è in esecuzione la tua query sotto.

L'esempio interrompe il thread, ma ciò non significa che il lavoro su SQL Server è stato terminato. Se ci pensi in questo modo: quando attraversi una zona di celle malfunzionanti e la chiamata cade, se tu/tua moglie/amico stavate parlando, smettono immediatamente di parlare? Questa è un'analogia di abortire il thread, almeno nel caso di lavorare con un server di database.

+5

Sta cercando di uccidere una query in corso, non un processo. –

Problemi correlati