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:
|