2011-10-20 15 views
13

Me gustaría dar al usuario la capacidad de cancelar una consulta en ejecución. La consulta es realmente lenta. (La optimización de la consulta es además del punto). Esto se debe principalmente a mi curiosidad.¿Pueden las consultas del servidor sql realmente cancelarse/anularse?

MSDN dice:

Si no hay nada que cancelar, no ocurre nada. Sin embargo, si hay un comando en proceso y el intento de cancelar falla, no se genera ninguna excepción .

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

es lo que tengo aquí:

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

Me di cuenta de que CurrentSearch.Abort() estaba bloqueando, es por eso que lo envolví en un hilo, lo que probablemente significa que el hilo todavía está funcionando.

Finalmente, ¿hay algo más que esto que pueda hacer para cancelar una consulta? ¿Es realmente posible cancelar una consulta tan larga desde .NET?

+1

son los datos de escritura consulta, o simplemente leerlo? –

+0

@BrianKnight Solo leyendo desde múltiples vistas. – Candide

Respuesta

9

si realmente todo quiere matarlo para un buen uso de este enfoque:

  • almacenar junto con el identificador de sesión justo antes de iniciar la consulta de larga duración llamando SELECT @@SPID AS 'SESSIONID' en la misma conexión

cuando se quiere acabar con él:

  • abrir una nueva conexión DB
  • emita un comando KILL para esa sesión ID
    cuidado ya la documentación de MSDN indica que necesita el permiso para hacer esto ALTER ANY CONNECTION
+3

El comando KILL requiere un permiso elevado - ALTER ANY CONNECTION. –

+0

cierto, pero es AFAIK la única solución al 100% a la pregunta ... – Yahia

+0

¡Fantástico! Eso lo hizo. ¡Gracias, Yahia! – Candide

-2

Sí, puede eliminar un proceso de .NET. Here is an example. Tenga en cuenta que necesitará los permisos adecuados y tendrá que descubrir el proceso en cuestión. No tengo una muestra rápida para determinar en qué proceso se está ejecutando su consulta.

Su ejemplo anula el hilo, pero eso no significa que el trabajo en SQL Server haya finalizado. Si lo piensas de esta manera: cuando pasas por una zona de celdas malo y la llamada se cae, si tu madre/amiga/amigo estaba zumbando, ¿dejan de hablar al instante? Esa es una analogía de abortar el hilo, al menos en el caso de trabajar con un servidor de base de datos.

+5

Está intentando matar una consulta en curso, no un proceso. –

Cuestiones relacionadas