Home   Cover Cover Cover Cover
 

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:

output