Asynchrone Kommandoausführung
Zu Abschnitt 5.3.2 des Buchs
Dieses Beispiel zeigt die asynchrone Ausführung einer Datenbankprozedur
MyLongRunningTransaction .
Diese fügt einen Satz in die Person -Tabelle ein und verzögert dann (künstlich) mit
einem WAIT DELAY den Rücksprung aus der Prozedur.
Das Programm setzt während der Ausführung des Kommandos mit Konsolenausgaben im Sekundentakt fort.
Ist die die Datenbankprozedur fertig, wird asynchron die Callback-Methode AsyncCmdEnded aufgerufen.
Diese liest mit der Methode EndExecuteNonQuery
die Anzahl der geänderten Zeilen aus und gibt dann eine Meldung über die geänderten Zeilen aus.
5-3-2-AsynchCommandSample.cs
using System;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Threading;
namespace Chapter5
{
public class AsynchCommandSample
{
static SqlCommand cmd;
static SqlConnection con = null;
public static void CallCmdAsync()
{
Console.WriteLine("Testprogramm f�r asynchrone Ausf�hrung von Datenbankkommandos.");
Console.WriteLine("Programm startet.");
SqlConnection conn = new SqlConnection
(
"Data Source=localhost\\SQLEXPRESS;Initial Catalog=netbook; " +
"Integrated Security=True; Asynchronous Processing=true"
);
cmd = new SqlCommand("MyLongRunningStoredProc", conn);
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
//---- Start der asynchronen Ausfuehrung des Kommandos
Console.WriteLine("-> Datenbankkommando wird asynchron gestartet.");
cmd.BeginExecuteNonQuery(new AsyncCallback(AsyncCmdEnded), null);
Console.WriteLine("Programm wird fortgesetzt.");
for (int i = 1; i <= 10; i++)
{
Thread.Sleep(1000);
Console.WriteLine(" {0}", i);
}
Console.WriteLine("Programm beendet.");
}
//---- Callback-Methode, ausgefuehrt bei Beendigung der Ausfuehrung des Kommandos
public static void AsyncCmdEnded(IAsyncResult result)
{
//---- verarbeite Ergebnis des Datenbankkommandos
int affectedRows = cmd.EndExecuteNonQuery(result);
Console.WriteLine("-> Asynchrones Kommando beendet!");
Console.WriteLine("-> Anzahl der betroffenen Zeilen: {0}", affectedRows);
}
public static void Main()
{
try
{
CallCmdAsync();
}
catch (Exception e)
{ // Fehlerbehandlung oder Exception an Aufrufer weitergeben
Console.WriteLine(e.Message);
}
}
}
}
|
Beim Ausführen des Programms wird folgende Ausgabe erzeugt:
|