Home   Cover Cover Cover Cover
 

Multiple Active Result Sets


Zu Abschnitt 5.3.3 des Buchs

Dieses Beispiel zeigt, wie man mehrere aktive Ergebnismengen gleichzeitig verwenden kann. Dieses Feature wird MARS genannt und ist nur in Verbindung mit dem SQL Server verfügbar. In der Verbindungszeichenfolge zur Verbindung mit der SQL Server-Datenbank wird die Eigenschaft MultipleActiveResultSets=true gesetzt. Dann werden Kommandoobjekte für den Zugriff auf die Customers- und Orders-Tabellen der Northwind-Datenbank erzeugt und ausgeführt. Es werden nun beide Resultate ausgelesen. In diesem Beispiel werden für alle Zeilen der Customers-Tabelle die entsprechenden Zeilen der Orders-Tabelle ausgegeben.

5-3-3-MARSSample.cs
using System;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;

namespace Chapter5
{
    class MARSSample
    {
        public static void Main()
        {
            //----- Aufbauen einer Verbindung zur Northwind-Datenbank am lokalen Rechner
            Console.WriteLine("Verbindung wird aufgebaut");
            string connStr = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=Northwind; " +
                "Integrated Security=SSPI; pooling=false; MultipleActiveResultSets=True";
            SqlConnection con = null; // Verbindung deklarieren
            try
            {
                con = new SqlConnection(connStr);
                con.Open(); //Verbindung anfordern   

                // Erzeugen zweier Komandoobjekte fuer eine Verbindung 
                string custCmdStr = "SELECT CustomerId, CompanyName " +
                       "FROM Customers ORDER BY CustomerId";
                SqlCommand custCmd = new SqlCommand(custCmdStr, con);
                string ordCmdStr = "SELECT CustomerId, OrderId, OrderDate " +
                        "FROM Orders ORDER BY CustomerId, OrderDate";
                SqlCommand ordCmd = new SqlCommand(ordCmdStr, con);

                // Ausfuehren der Kommandos 
                IDataReader custRdr = custCmd.ExecuteReader();
                IDataReader ordRdr = ordCmd.ExecuteReader(); 

                // gleichzeitiges Lesen der Daten mittels der beiden IDataReader
                string custId = null;
                bool moreOrders = ordRdr.Read(); 
                while (custRdr.Read() && moreOrders)
                {
                    custId = custRdr.GetString(0);
                    string custName = custRdr.GetString(1);
                    while (ordRdr.Read() && custId == ordRdr.GetString(0)) 
                    {

                        Console.WriteLine(custName + " ordered " + ordRdr.GetInt32(1) +
                            " at " + ordRdr["OrderDate"]);
                        moreOrders = ordRdr.Read();
                    }
                }

            }
            catch (Exception e)
            {  // Fehlerbehandlung oder Exception an Aufrufer weitergeben
                Console.WriteLine(e.Message);
            }
            finally
            {
                try
                {
                    if (con != null) con.Close(); // Verbindung schlieen
                }
                catch (Exception ex) { Console.WriteLine(ex.Message); }
            }
        }
    }
}

Beim Ausführen des Programms wird folgende Ausgabe erzeugt:

output