Ho cercato di rendere il titolo più specifico possibile. Fondamentalmente quello che ho in esecuzione all'interno di un filo BackgroundWorker ora è un codice che assomiglia:Come eseguire una query SQL sull'operazione DataTable che può essere annullata
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();
Dove query è una stringa che rappresenta un grande, in termini di tempo query e conn è l'oggetto di connessione.
Il mio problema ora è che ho bisogno di un pulsante di arresto. Sono giunto alla conclusione che uccidere chi lavora in background sarebbe inutile perché voglio mantenere i risultati che rimangono dopo che la query è stata cancellata. Inoltre, non sarebbe in grado di controllare lo stato annullato fino a dopo la query.
Quello che mi è venuta in mente finora:
Ho cercato di concettualizzare come gestire in modo efficiente senza prendere troppo grande di un calo di prestazioni.
La mia idea era di utilizzare un SqlDataReader per leggere i dati dal pezzo di query alla volta in modo che avessi un "ciclo" per controllare un flag che potevo impostare dalla GUI tramite un pulsante. Il problema è che, per quanto so, non posso usare il metodo Load() di un datatable ed essere ancora in grado di cancellare lo sqlcommand. Se sbaglio, per favore fammelo sapere perché ciò renderebbe l'annullamento un po 'più facile.
Alla luce di quello che ho scoperto sono venuto alla realizzazione io possa essere in grado di annullare il SqlCommand mid-query solo se ho fatto qualcosa di simile al di sotto (pseudo-codice):
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
}
Tuttavia, mi sembra che sarebbe molto inefficace e probabilmente costoso. È questo l'unico modo per uccidere uno sqlcommand in corso che deve assolutamente essere in un datatable? Qualsiasi aiuto sarebbe apprezzato!
una domanda molto buona! – Adi
Uccidere un thread non è mai una buona idea. Hai provato 'cmd.Cancel();'? –
Perché pensi che l'uso di DataReader sarebbe costoso? – Habib