Threaded Sql Query in C #

ive suchte nach dem Archiv aber kann nicht einen passenden Eintrag finden. Entschuldigung, wenn es existiert.

Im mit vs2008, .NET 3.5, MS-SQL2008

Mein Code ist einfach;

SqlConnection CONN=new SqlConnection(SomeConnectionString); CONN.Open(); SqlCommand cmd = CONN.CreateCommand(); cmd.CommandText="SELECT FIELD1,FIELD2,FIELD3 from table1"; SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); 

so ist DataTable dt gebrauchsfertig.

Aber ich möchte die Abfrage vom Benutzer gestoppt werden, coz es kann zu lange dauern, um zu warten. so wird der Benutzer die Abfrage stoppen, Parameter ändern und requery.

Auch ich möchte eine Stoppuhr für die Abfragezeit während der Abfrageausführung zeigen.

Wie erwartet, kann ich das nicht im selben Thread von sql query machen.

Was sollte der beste und einfachste Threading-Ansatz für über Code sein? Kann jemand ein Stück Code dafür antworten? beachten Sie, dass; DataTable dt muss für das Hauptfaden am Ende vorhanden sein.

Danke im Voraus

Nun, wenn Sie einen separaten Thread machen und den Befehl dort ausführen möchten, können Sie diesen Code ausprobieren:

 System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(LoadDB)); thread.Start(); //put this command wherever you want private void LoadDB() { SqlConnection CONN=new SqlConnection(SomeConnectionString); CONN.Open(); SqlCommand cmd = CONN.CreateCommand(); cmd.CommandText="SELECT FIELD1,FIELD2,FIELD3 from table1"; SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); } 

Ich habe Angst, dass es keine asynchronouse oder IDbDataAdapter API für IDbDataAdapter oder DataTable.Load , also ist dein einziger path, den Job in einem ThreadPool Thread wie in https://stackoverflow.com/a/2108944/307976 zu machen und vergiss es wenn du willst es abbrechen

Sie können den SqlCommand.BeginExecuteReader , um einen asynchronousen Befehl zu starten. Damit können Sie mit der UI (Ihre "Stoppuhr") umgehen und die Arbeit im asynchronousen callback fortsetzen.

Gehen Sie zurück zu einem UI-Thread ist einfach, wenn der callback nicht endet automatisch dort automatisch, verwenden Sie einfach Invoke auf einige Kontrolle und dieser Code wird auf dem UI-Thread am frühesten Bequemlichkeit verarbeitet werden.

Sie können SqlCommand.Cancel anrufen, SqlCommand.Cancel zu versuchen, die Abfrage abzubrechen, die funktionieren sollte, meistens. Wenn es nicht, ist Ihre einzige andere Wahl, um eine andere SqlConnection und ein anderes SqlCommand zu erstellen und die andere Verbindung durch SQL zu töten.

SqlCommand.Cancel könnte hier von Nutzen sein.

Erstellen Sie eine class wie im Link hier angegeben . Dieser Link gibt ein gutes Beispiel dafür, wie man einen Thread anfängt und ihn anmutig beendet.

Die class Worker in diesem Link hat 2 methods, die Sie beachten sollten. DoWork in dem Sie Ihre SQL-Abfrage aufrufen können und die andere ist RequestStop in dem Sie Ihre SqlCommand.Cancel anrufen können, die Ihre Ausführung der Abfrage auf serverseite stoppen sollte. RequestStop Methode kann von einem User-Event wie Button-Button aufgerufen werden, die wiederum die Ausführung der Abfrage beenden wird.

Hoffe das hilft.

Versuche so etwas …

  Thread t = new Thread(() => { using (SqlConnection con = new SqlConnection(_someConnectionString)) { string query = "SELECT FIELD1, FIELD2, FIELD3 FROM table1"; using (SqlCommand com = new SqlCommand(query, con)) { try { con.Open(); using (SqlDataReader reader = com.ExecuteReader()) { if (reader.HasRows) { DataTable dt = new DataTable(); dt.Load(reader); } } } catch (Exception ex) { // Anything you want to do with ex } finally { con.Close(); } } } }); t.IsBackground = true; t.Start();