Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Über den Autor
Vorwort zur 4. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Klassendesign und Vererbung
4 Weitere .NET-Datentypen
5 Weitere Möglichkeiten von C#
6 Projektmanagement und Visual Studio 2008
7 Fehlerbehandlung und Debugging
8 LINQ
9 Multithreading und asynchrone Methodenaufrufe
10 Arbeiten mit Dateien und Streams
11 Serialisierung
12 Einige wichtige .NET-Klassen
13 Grundlagen zum Erstellen einer Windows-Anwendung
14 Die wichtigsten Steuerelemente
15 Tastatur- und Mausereignisse
16 MDI-Anwendungen
17 Grafische Programmierung mit GDI+
18 Das Drucken (Printing)
19 Steuerelemente entwickeln
20 Programmiertechniken
21 WPF – die Grundlagen
22 Die Layoutcontainer
23 Die WPF-Controls
24 Konzepte von WPF
25 ADO.NET – die Verbindung zu einer Datenbank herstellen
26 Die Datenbankabfrage
27 Der SqlDataAdapter
28 Daten im lokalen Speicher – das DataSet
29 Eine Datenbank aktualisieren
30 Stark typisierte DataSets
31 Weitergabe von Anwendungen
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual C# 2008 von Andreas Kuehnel
Das umfassende Handbuch
Buch: Visual C# 2008

Visual C# 2008
geb., mit DVD
1.366 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1172-7
Pfeil 26 Die Datenbankabfrage
Pfeil 26.1 Das »SqlCommand«-Objekt
Pfeil 26.1.1 Ein »SqlCommand«-Objekt erzeugen
Pfeil 26.1.2 Ausführen des »SqlCommand«-Objekts
Pfeil 26.1.3 Die Eigenschaft »CommandTimeout« des »SqlCommand«-Objekts
Pfeil 26.1.4 Aktionsabfragen absetzen
Pfeil 26.1.5 Abfragen, die genau ein Ergebnis liefern
Pfeil 26.2 Das »SqlDataReader«-Objekt
Pfeil 26.2.1 Datensätze einlesen
Pfeil 26.2.2 Schließen des »SqlDataReader«-Objekts
Pfeil 26.2.3 MARS (Multiple Active Resultsets)
Pfeil 26.2.4 Batch-Abfragen mit »NextResult« durchlaufen
Pfeil 26.2.5 Das Schema eines »SqlDataReader«-Objekts untersuchen
Pfeil 26.3 Parametrisierte Abfragen
Pfeil 26.3.1 Parametrisierte Abfragen mit dem SqlClient-Datenprovider
Pfeil 26.3.2 Die Klasse »SqlParameter«
Pfeil 26.3.3 Parametrisierte Abfragen mit dem OleDb-Datenprovider
Pfeil 26.4 Asynchrone Abfragen
Pfeil 26.4.1 Das Polling-Verfahren
Pfeil 26.4.2 Bereitstellen einer Rückrufmethode
Pfeil 26.5 Gespeicherte Prozeduren (Stored Procedures)
Pfeil 26.5.1 Allgemeines zu gespeicherten Prozeduren
Pfeil 26.5.2 Gespeicherte Prozeduren im Visual Studio 2008 erstellen
Pfeil 26.5.3 Eine gespeicherte Prozedur aufrufen
Pfeil 26.5.4 Komplexe gespeicherte Prozeduren


Galileo Computing - Zum Seitenanfang

26.3 Parametrisierte Abfragen Zur nächsten ÜberschriftZur vorigen Überschrift

Die Suche nach einem bestimmten Datensatz einer Tabelle wird durch die WHERE-Klausel einer SELECT-Abfrage bestimmt:

SELECT ProductName FROM Products WHERE ProductName='Tunnbröd'

Unstrittig ist, dass die Hartcodierung dieser Abfrage nicht praxisgerecht ist. Was ist, wenn der Benutzer nicht nach dem Artikel Tunnbröd suchen möchte, sondern die Informationen über den Artikel Tofu benötigt? Die Abfrage muss allgemeiner formuliert werden, und zwar so, dass der Anwender zur Laufzeit des Programms den Artikel beliebig bestimmen kann.

Die Lösung lautet: Wir müssen eine parametrisierte Abfrage formulieren. Berücksichtigen Sie bei den folgenden Ausführungen jedoch, dass die Wahl des .NET-Datenproviders maßgeblich die Syntax des SELECT-Statements und des Programmcodes einer parametrisierten Abfrage beeinflusst.


Galileo Computing - Zum Seitenanfang

26.3.1 Parametrisierte Abfragen mit dem SqlClient-Datenprovider Zur nächsten ÜberschriftZur vorigen Überschrift

Ist die Entscheidung auf den SqlClient-Datenprovider gefallen, könnte das Statement wie folgt lauten:

SELECT * FROM Products WHERE ProductName = @Productname OR CategoryID = @CatID

@ProductName und @CatID sind benannte Parameter, denen das »@«-Zeichen vorangestellt wird. Dieses gilt jedoch nur im Zusammenhang mit dem SqlClient-Datenprovider. Die Datenprovider OleDb und Odbc unterstützen benannte Parameter nicht, sondern nur den generischen Parametermarker. Dabei handelt es sich um das Fragezeichen (»?«). Der Grund für diese Abweichung der Datenprovider ist sehr einfach. Während der OleDb- bzw. Odbc-Datenprovider eine datenbankunabhängige Syntax erlaubt, ist der SqlClient-Provider für den SQL Server gedacht, der benannte Parameter mit diesem Präfix unterstützt.

Die Parameter einer parametrisierten Abfrage werden vom SqlCommand-Objekt gesammelt. Dieses besitzt dazu eine Parameters-Auflistung, der die einzelnen Parameter hinzugefügt werden. Wenn Sie den SqlClient-Datenprovider verwenden, handelt es sich um den Typ SqlParameter. Sie können einen Parameter hinzufügen, indem Sie entweder die Add-Methode der Auflistung oder die Methode AddWithValue aufrufen.

Das Beispiel ParametrisierteAbfrageMitSqlClient verwendet zum Hinzufügen die Methode AddWithValue. Gesucht wird dabei nach allen Artikeln, die einer bestimmten Kategorie zugeordnet sind (hier: 1), und zusätzlich nach dem Artikel mit der Bezeichnung Konbu. Die beiden Parameter werden mit statischen Werten gefüllt. In der Praxis würden Sie die Werte dem Eingabestrom oder beispielsweise einer Textbox entnehmen, um die Abfrage flexibel zu gestalten.

// ------------------------------------------------------------
// Beispiel: ...\Kapitel 26\ParametrisierteAbfrageMitSqlClient
// ----------------------------------------------------------------
class Program {

  static void Main(string[] args) { 
    SqlConnection con = new SqlConnection("..."); 
    string strSQL = "SELECT * FROM Products " + 
                    "WHERE ProductName = @Productname OR " + 
                           "CategoryID = @CatID"; 
    SqlCommand cmd = new SqlCommand(strSQL, con); 
    // Parameter hinzufügen und Werte übergeben 
    cmd.Parameters.AddWithValue("@Productname", "Konbu"); 
    cmd.Parameters.AddWithValue("@CatID", "1"); 
    con.Open(); 
    SqlDataReader rd = cmd.ExecuteReader(); 
    while (rd.Read()) 
      Console.WriteLine("{0,-5}{1,-35}{2}", 
             rd["ProductID"], rd["ProductName"], rd["UnitPrice"]); 
    rd.Close(); 
    con.Close(); 
    Console.ReadLine(); 
  } 
}

Wenn Sie den SqlClient-Provider benutzen, ist die Reihenfolge der Parameter innerhalb der Parameters-Auflistung des SqlCommand-Objekts unbedeutend, da sie anhand ihres Bezeichners eindeutig identifiziert werden können.

Bei beiden Parametern handelt es sich in diesem Beispiel um Zeichenfolgen, die auch als solche an die Datenbank weitergeleitet werden. Sie können hier jeden Datentyp angeben, denn das zweite Argument von AddWithValue ist als vom Typ Object definiert.

Einen Haken kann der doch sehr einfache Einsatz der Methode AddWithValue noch haben: Wenn Sie bei der Wertübergabe einen ungeeigneten Datentyp verwenden, behandelt die Datenbank die im Parameter gespeicherte Information vielleicht nicht so, wie Sie es erwarten. Unter Umständen gibt der SQL Server sogar eine Ausnahme vom Typ SqlException zurück, weil der übermittelte Parameter mit der Typdefinition der entsprechenden Spalte nicht übereinstimmt. Sie können das sehr leicht selbst testen, indem Sie im Code des Beispiels anstelle des Artikelbezeichners Konbu eine Integerzahl eintragen.

Der Datenbank diese Verantwortung zu übertragen, ist weder eine elegante noch eine gute Lösung. Der richtige Datentyp sollte zumindest im Code des Clients sichergestellt sein. Dazu bietet sich die vielfach überladene Methode Add an, die über den Parameterbezeichner hinaus auch den an die Datenbank übergebenen Datentyp steuert. Zudem gibt es noch die Möglichkeit, den Datentyp genauer zu spezifizieren. Beispielsweise können Zeichenfolgen eine unterschiedliche Länge aufweisen. Die Länge kann als drittes Übergabeargument bekannt gegeben werden. In unserem Beispiel oben könnten die beiden Anweisungen

cmd.Parameters.AddWithValue("@Name", "Oakland"); 
cmd.Parameters.AddWithValue("@City", "Oakland");

durch

cmd.Parameters.Add("@Productname", SqlDbType.VarChar, 40).Value = "Konbu"; 
cmd.Parameters.Add("@CatID", SqlDbType.Int).Value = 1;

ersetzt werden.

Übergeben Sie einem der beiden Parameter einen Integer, wird keine Ausnahme ausgelöst. Das Ergebnis erscheint im ersten Moment ernüchternd und der vorher gemachten Aussage zu widersprechen, dass die Methode Add eine Typüberprüfung gewährleistet. Die Ursache ist allerdings einfach zu erklären: Die Integerzahl wird implizit als Zeichenfolge im Parameter eingetragen. Anders sieht es jedoch aus, wenn ein Parameter als Integer festgelegt wird und Sie versuchen, diesem eine Zeichenfolge zuzuweisen:

cmd.Parameters.Add("@Param", SqlDbType.Int).Value = "White";

Beim Aufruf von ExecuteReader wird die Ausnahme FormatException ausgelöst. Diese stammt nicht vom SQL Server, sondern wird von ADO.NET in der Clientanwendung ausgelöst. Damit haben wir ein Ziel erreicht: die Entlastung der Datenbank.

Der Datentyp, den Sie der Add-Methode übergeben, stammt aus der Enumeration SqlDbType. Die Mitglieder dieser Aufzählung beschreiben die Datentypen, die SQL Server standardmäßig bereitstellt.


Galileo Computing - Zum Seitenanfang

26.3.2 Die Klasse »SqlParameter« Zur nächsten ÜberschriftZur vorigen Überschrift

Solange nicht ausdrücklich Parameter hinzugefügt werden, ist die Parameters-Auflistung des SqlCommand-Objekts leer. Die Referenz auf die Auflistung erhalten Sie über die Eigenschaft Parameters. Ein Parameter wird durch Aufruf der Methode Add oder AddWithValue hinzugefügt. Alle anderen Methoden der Auflistung gleichen denen aller anderen üblichen Auflistungen von .NET: Mit Count ruft man die Anzahl der Parameter ab, mit Remove wird ein Parameter gelöscht usw.

Die Methode Add ist vielfach überladen, AddWithValue überhaupt nicht. Beiden ist aber eines gemeinsam: Der Rückgabewert ist die Referenz auf das hinzugefügte SqlParameter-Objekt.

public SqlParameter Add(string, SqlDbType, int);

Meistens können Sie den Rückgabewert ignorieren. Er ist dann interessant, wenn man die Eigenschaften des Parameters auswerten oder vor dem Absetzen des SQL-Kommandos ändern möchte.

Zum Füllen des Parameters wird der Eigenschaft Value des SqlParameter-Objekts der gewünschte Wert zugewiesen:

cmd.Parameters["@ParameterName"].Value = "Chai";

Sie rufen den Indexer der SqlParameterCollection auf und übergeben den Bezeichner des Parameters. Alternativ können Sie auch den Index des entsprechenden Parameter-Objekts in der Auflistung verwenden.


Galileo Computing - Zum Seitenanfang

26.3.3 Parametrisierte Abfragen mit dem OleDb-Datenprovider topZur vorigen Überschrift

An dieser Stelle möchte ich Ihnen auch noch zeigen, wie eine parametrisierte Abfrage auf Basis des OleDb-Datenproviders formuliert wird.

// -------------------------------------------------------------
// Beispiel: ...\Kapitel 26\ParametrisierteAbfrageMitSqlClient
// -----------------------------------------------------------------
class Program {

  static void Main(string[] args) { 
    OleDbConnection con = new OleDbConnection("Provider=SQLNCLI;..."); 
    string strSQL = "SELECT * FROM Products " + 
                    "WHERE ProductName = ? OR CategoryID = ?"; 
    OleDbCommand cmd = new OleDbCommand(strSQL, con); 
    // Parameter hinzufügen und Werte übergeben 
    cmd.Parameters.Add("Artikel", OleDbType.VarChar, 40); 
    cmd.Parameters.Add("ID", OleDbType.Integer); 
    cmd.Parameters["Artikel"].Value = "Konbu"; 
    cmd.Parameters["ID"].Value = 1; 
    con.Open();

    OleDbDataReader rd = cmd.ExecuteReader(); 
    while (rd.Read()) 
      Console.WriteLine("{0,-5}{1,-35}{2}", 
           rd["ProductID"], rd["ProductName"], rd["UnitPrice"]); 
    rd.Close(); 
    con.Close(); 
    Console.ReadLine(); 
  } 
}

Eine Änderung erfährt zunächst die Verbindungszeichenfolge, die um

Provider=SQLNCLI

ergänzt werden muss, um die Vorschriften des OleDb-Datenproviders zu erfüllen. Die Parameter der Abfrage werden durch »?« beschrieben, sind demnach in der Abfrage nicht mehr eindeutig. Das hat zur Folge, dass beim Hinzufügen der Parameter zur Parameter-Auflistung des OleDbCommand-Objekts die Reihenfolge unbedingt beachtet werden muss. Erst beim Hinzufügen erhalten die Parameter Bezeichner. Die einzelnen Parameter können dann entweder über den Index oder den Bezeichner angesprochen werden.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual C# 2008
Visual C# 2008
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Visual C# 2012






 Visual C# 2012


Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de