Intenté que el título fuera lo más específico posible. Básicamente lo que he ejecuta dentro de un hilo BackgroundWorker ahora es un código que se parece a:Cómo realizar una consulta SQL a la operación de DataTable que puede cancelarse
SqlConnection conn = new SqlConnection(connstring);
SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(Results);
conn.Close();
sda.Dispose();
Cuando la consulta es una cadena que representa un gran, tiempo de consulta, y conn es el objeto de conexión.
Mi problema ahora es que necesito un botón de detención. Me di cuenta de que matar al backgroundworker sería inútil porque aún quiero conservar los resultados que quedan después de que se cancela la consulta. Además, no podría verificar el estado cancelado hasta después de la consulta.
Lo que he encontrado hasta el momento:
He estado tratando de conceptualizar cómo manejar esto de manera eficiente sin tener demasiado grande de un impacto en el rendimiento.
Mi idea era utilizar un SqlDataReader para leer los datos de la pieza de consulta a la vez para que tuviera un "bucle" para verificar un indicador que podía establecer desde la GUI mediante un botón. El problema es que, por lo que sé, no puedo usar el método Load() de una tabla de datos y todavía puedo cancelar el comando sql. Si me equivoco, por favor avíseme porque eso facilitaría la cancelación.
A la luz de lo que he descubierto que llegué a la conclusión de que sólo puede ser capaz de cancelar la mitad de consulta SqlCommand si hice algo como lo de abajo (pseudo-código):
while(reader.Read())
{
//check flag status
//if it is set to 'kill' fire off the kill thread
//otherwise populate the datatable with what was read
}
Sin embargo, Me parece que esto sería altamente ineficaz y posiblemente costoso. ¿Es esta la única manera de matar un comando sql en progreso que absolutamente debe estar en una tabla de datos? ¡Cualquier ayuda sería apreciada!
¡una pregunta muy decente! – Adi
Matar un hilo nunca es una buena idea. ¿Has probado 'cmd.Cancel();'? –
¿Por qué crees que usar DataReader sería costoso? – Habib