Datenbankanwendungen in Visual Studio .NET zusammenstellen, Teil 2

Veröffentlicht: 13. Jun 2002 | Aktualisiert: 21. Jun 2004

Von Matt Mannion und Jon Rauschenberger

Visual Studio .NET enthält eine Reihe von Tools und Datenzugriffsklassen, die das Zusammenstellen von Datenbankanwendungen mit Microsoft SQL ServerT 2000 vereinfachen. Das Whitepaper bietet eine Einführung in die neuen Tools und Datenklassen. Zudem zeigt es, wie man eine Datenbankanwendung aufbaut.

Auf dieser Seite

 DataSets
 ADO.NET-Zugriff auf SQL Server 
 XML und Visual Studio .NET
 SQLXML 3.0 
 Datenbankprojekte
 Generieren von Skripts zum Erstellen und Exportieren von Daten 
 Befehlsdatei des Datenbankprojekts
 Schlussfolgerung

DataSets

Bis jetzt verfügen wir über eine ServiceCall-Datenbank und -Verbindung, eine benutzerdefinierte Funktion und eine gespeicherte Prozedur. Als nächstes erstellen wir mithilfe der gespeicherten Prozedur ein DataSet, mit dem wir ein Datenraster füllen.

So erstellen Sie ein DataSet

  1. Öffnen Sie die Toolbox, indem Sie im Menü Ansicht auf Toolbox klicken.

  2. Klicken Sie in der Toolbox auf die Registerkarte Daten, und ziehen Sie das SqlDataAdapter-Steuerelement auf das Formular1. Dadurch wird ein Symbol für SqlDataAdapter1 an den unteren Rand des Entwurffensters für Formular1 eingefügt und der Datenadapter-Konfigurations-Assistent gestartet. Der Datenadapter-Konfigurations-Assistent sammelt Informationen über die Daten, die der Adapter verwaltet.

  3. Sobald Sie der Assistent nach der zu verwendenden Datenverbindung fragt, geben Sie die ServiceCall-Verbindung an

    sql_builddbappsinvsnet_12

    Abbildung 12. Eigenschaftenseite "Wählen Sie Ihre Datenverbindung"

  4. Wählen Sie als nächstes einen der folgenden Abfragetypen aus:

    • SQL-Anweisungen verwenden - Geben Sie eine Transact-SQL-Anweisung an, oder verwenden Sie den Abfrage-Generator, um eine Abfrage grafisch zu entwerfen.

    • Neue gespeicherte Prozeduren erstellen - Der Assistent erstellt automatisch gespeicherte Prozeduren für Select, Insert, Update und Delete, die auf Transact-SQL-Anweisungen des Assistenten basieren.

    • Vorhandene gespeicherte Prozeduren verwenden - Geben Sie bis zu vier vorhandene gespeicherte Prozeduren an, eine für jede der folgenden vier Aktionen. Sie müssen nicht alle vier gespeicherten Prozeduren angeben. Der SqlDataAdapter ist dafür konfiguriert, die angegebenen gespeicherten Prozeduren mit der entsprechenden Datenbankaktion zu verknüpfen: Select - Diese Aktion liest vorhandene Daten aus der Datenbank. Insert - Diese Aktion fügt neue Zeilen in die Datenbanktabelle oder -tabellen ein. Update - Diese Aktion aktualisiert vorhandenen Zeilen. Delete - Diese Aktion löscht vorhandene Zeilen

  5. Unabhängig vom gewählten Abfragetyp haben Sie die Möglichkeit, das grafische Abfragetool zur Erstellung der Abfrage zu verwenden und eine der folgenden erweiterten Optionen für die Transact-SQL-Generierung auszuwählen:

    • Insert-, Update- und Delete-Anweisungen generieren - Mit dieser Option generieren Sie Insert-, Update- und Delete-Anweisungen auf der Basis der Select-Anweisung.

    • Vollständige Parallelität verwenden - Diese Option modifiziert Update- und Delete-Anweisungen, um zu ermitteln, ob sich die Datenbank seit dem letzten Laden des Datensatzes in das DataSet geändert hat.

    • DataSet aktualisieren - Diese Option fügt eine Select-Anweisung hinzu, um Werte von Identitätsspalten abzurufen und die von der Datenbank berechneten Werte zu aktualisieren.

    Wählen Sie den Abfragetyp Vorhandene gespeicherte Prozeduren verwenden aus.

    sql_builddbappsinvsnet_13

    Abbildung 13. Eigenschaftenseite "Abfragetyp auswählen"

  6. Wählen Sie auf der Seite Befehle an vorhandene gespeicherte Prozeduren binden in der Dropdown-Liste Auswählen die Option BrowseInvoiceTotals aus.

    sql_builddbappsinvsnet_14

    Abbildung 14. Eigenschaftenseite "Befehle an vorhandene gespeicherte Prozeduren binden"

  7. Ignorieren Sie die Dropdown-Listen Einfügen, Aktualisieren und Löschen. Klicken Sie auf Weiter und anschließend auf Fertig stellen.

    sql_builddbappsinvsnet_15

    Abbildung 15. Eigenschaftenseite "Assistentenergebnisse anzeigen"

Als nächstes wird das von SqlDataAdapter generierte DataSet konfiguriert.

So konfigurieren Sie das DataSet

  1. Klicken Sie auf dem Form1 mit der rechten Maustaste auf das Symbol SqlDataAdapter1, und klicken Sie anschließend auf DataSet generieren.

    sql_builddbappsinvsnet_16

    Abbildung 16. DataSet für den SqlDataAdapter generieren

  2. Wählen Sie im Dialogfeld DataSet generieren die Option Neu aus, und geben Sie anschließend den Namen BrowseInvoiceTotalsDS ein.

  3. Im Fenster am unteren Seitenrand sollte die Option BrowseInvoiceTotals(SqlDataAdapter1) ausgewählt sein. Klicken Sie auf OK.

    sql_builddbappsinvsnet_17

    Abbildung 17. Eigenschaftenseite "DataSet generieren"

Im Anschluss werden die Formularelemente für Form1 erstellt.

So erstellen Sie die Formularelemente

  1. Fügen Sie dem Formular ein DataGrid-Steuerelement hinzu.

  2. Öffnen Sie die Toolbox, und klicken Sie anschließend auf Windows Forms.

  3. Ziehen Sie ein DataGrid-Steuerelement auf Form1, klicken Sie mit der rechten Maustaste auf das DataGrid-Steuerelement, und klicken Sie anschließend auf Eigenschaften. Ändern Sie die Eigenschaft CaptionText des DataGrid-Steuerelements in Rechnungsbericht um.

  4. Konfigurieren Sie die Eigenschaften des DataGrid-Steuerelements, um es an die Daten zu binden: Setzen Sie unter Eigenschaften im Abschnitt Daten die Eigenschaft DataSource auf BrowseInvoiceTotalsDS1.BrowseInvoiceTotals.

    sql_builddbappsinvsnet_18_thumb

    Abbildung 18. Eigenschaftenseite für "DataGrid"

  5. Ändern Sie die Größe des Steuerelements DataGrid, damit alle Spalten sichtbar sind.

  6. Um das DataSet auszufüllen, fügen Sie dem Form1 eine Schaltfläche hinzu, und ändern Sie deren Eigenschaften Text und Name in Bericht ausführen um.

  7. Doppelklicken Sie auf die Schaltfläche, um das Codefenster zu öffnen. Fügen Sie der RunReport_Click-Subroutine die folgenden Codezeilen hinzu, und speichern Sie die Anwendung:

    BrowseInvoiceTotalsDS1.Clear
    'DS mit SqlDataAdapter füllen
    SqlDataAdapter1.Fill(BrowseInvoiceTotalsDS1)
    
  8. Die Anwendung kann nun getestet werden. Führen Sie die Anwendung aus, und klicken Sie auf die Schaltfläche Bericht ausführen. Der SqlDataAdapter stellt eine Verbindung mit der Datenbank her, führt die gespeicherte Prozedur und Funktion aus, lädt das DataSet und übergibt die Daten an das Datenraster. Die Ausgabe sollte der Abbildung 19 entsprechen.

    sql_builddbappsinvsnet_19_thumb

    Abbildung 19. Ausgabe der Beispielanwendung

Als nächstes erstellen wir ein Formular zur Datenverwaltung.

So erstellen Sie ein Formular zur Datenverwaltung

  1. Fügen Sie dem ServiceCall-Projekt ein neues Formular (Form2) hinzu. Klicken Sie dazu im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, klicken Sie auf Hinzufügen, und anschließend auf Windows Form hinzufügen.

  2. Klicken Sie unter Vorlagen auf die Vorlage Windows Form, und klicken Sie anschließend auf Öffnen.

  3. Fügen Sie dem Formular das SqlDataAdapter-Steuerelement hinzu. Der Datenadapter-Konfigurations-Assistent wird gestartet.

  4. Wählen Sie die vorhandene ServiceCall-Verbindung für den SqlDataAdapter aus. Für dieses SqlDataAdapter-Steuerelement werden die erforderlichen gespeicherten Prozeduren von Visual Studio .NET automatisch erstellt.

  5. Klicken Sie auf Neue gespeicherte Prozeduren erstellen, und klicken Sie anschließend auf Weiter. Die Seite Gespeicherte Prozeduren generieren wird geöffnet. Klicken Sie auf den Abfrage-Generator, fügen Sie der Abfrage die Tabelle Customers hinzu, und schließen Sie anschließend das Dialogfeld Tabelle hinzufügen.

  6. Klicken Sie auf den Abfrage-Generator, fügen Sie der Abfrage die Tabelle Customers hinzu, und schließen Sie anschließend das Dialogfeld Tabelle hinzufügen.

  7. Wählen Sie im Diagrammbereich alle Spalten aus, klicken Sie auf OK, und anschließend auf Weiter.

  8. Geben Sie auf der Seite Gespeicherte Prozeduren erstellen einen Namen für jede der vier neuen gespeicherten Prozeduren an (verwenden Sie in diesem Beispiel CustomersSelect, CustomersDelete, CustomersInsert und CustomersUpdate), und klicken Sie auf Weiter.

  9. Wenn auf der letzten Seite des Assistenten eine Nachricht angezeigt wird, dass alle gespeicherten Prozeduren erfolgreich generiert wurden, klicken Sie auf Fertig stellen.

  10. Öffnen Sie die Eigenschaftenseite für das Steuerelement SqlDataAdapter, und beachten Sie in den nachfolgenden Eigenschaften, dass diese auf den Wert der angegebenen Namen für die gespeicherten Prozeduren gesetzt wurden.

    • Der Wert von SelectCommand.CommandText ist CustomersSelect.

    • Der Wert von DeleteCommand.CommandText ist CustomersDelete.

    • Der Wert von InsertCommand.CommandText ist CustomersInsert.

    • Der Wert von UpdateCommand.CommandText ist CustomersUpdate.

Visual Studio .NET hat also vier gespeicherte Prozeduren auf der Basis der zur Verfügung gestellten Select-Anweisung erstellt, diese in die Datenbank kompiliert und das SqlDataAdapter-Steuerelement für ihre Verwendung konfiguriert. Der nächste Schritt ist die Generierung des DataSets für den SqlDataAdapter, der für Form2 erstellt wurde.

So generieren Sie das DataSet

  1. Klicken Sie mit der rechten Maustaste auf SqlDataAdapter, und klicken Sie anschließend auf DataSet generieren.

  2. Geben Sie dem DataSet die Bezeichnung CustomersDS.

  3. Fügen Sie dem Formular ein DataGrid-Steuerelement hinzu, setzen Sie die Eigenschaft DataSource auf CustomersDS1.Customers, und setzen Sie die Eigenschaft CaptionText auf Kundenpflege.

  4. Ändern Sie die Größe des Steuerelements DataGrid, damit alle Spalten sichtbar sind.

  5. Fügen Sie eine Schaltfläche unter dem Datenraster hinzu, und ändern Sie ihre Eigenschaften Text und Name in Laden um.

  6. Fügen Sie eine weitere Schaltfläche neben der ersten hinzu, und ändern Sie ihre Eigenschaften Text und Name in Aktualisieren um.

  7. Doppelklicken Sie auf die Schaltfläche Laden, um das Codefenster zu öffnen, und fügen Sie dem Klickereignis der Schaltfläche Laden den folgenden Code hinzu:CustomersDS1.Clear()SqlDataAdapter1.Fill(CustomersDS1)

  8. Fügen Sie dem Klickereignis der Schaltfläche Aktualisieren den folgenden Code hinzu:SqlDataAdapter1.Update(CustomersDS1)

Bevor Sie die Anwendung ausführen können, müssen Sie das Startobjekt für das Projekt in Form2 umändern.

So ändern Sie das Startobjekt

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das ServiceCall-Projekt, und klicken Sie anschließend auf Eigenschaften.

  2. Ändern Sie unter Startobjekt das Objekt Starten in Form2 um, und klicken Sie anschließend auf OK.

Führen Sie die Anwendung aus, um das Kundenpflegeformular zu öffnen (Form2). Klicken Sie auf die Schaltfläche Laden, um das Datenraster mit den Daten zu laden, die sich gerade in der Tabelle befinden. Der Bildschirm sollte der Abbildung 20 entsprechen.

sql_builddbappsinvsnet_20_thumb

Abbildung 20. Ausgabe der Beispielanwendung

So aktualisieren Sie die ServiceCall-Datenbank

  1. Um eine Zeile zu löschen, klicken Sie darauf, und drücken Sie anschließend die Taste ENTF.

  2. Um eine neue Zeile hinzuzufügen, klicken Sie in einer beliebigen Zelle in der leeren Zeile am Ende des Rasters, und geben Sie dann die entsprechenden Werte an.

  3. Wenn Sie mit der Eingabe der Änderungen fertig sind, klicken Sie auf Aktualisieren

Das System überprüft den Zeilenstatus jeder Zeile im Raster, ruft die entsprechende gespeicherte Prozedur auf, und übergibt die korrekten Parameter, um die angeforderte Aktion zu verarbeiten.
Dieses Beispiel demonstriert die Leistungsfähigkeit der Visual Studio .NET-IDE und des Framework. Mit nur wenigen Zeilen Code wurde eine voll funktionsfähige Anwendung zur Tabellenverwaltung erstellt.

 

ADO.NET-Zugriff auf SQL Server 

Das Microsoft .NET Framework enthält eine neue Version von ADO, mit der Bezeichnung ADO.NET. ADO.NET bietet eine verbesserte Unterstützung der Entwicklung von verteilten Anwendungen und lehnt sich in seiner internen Datenstruktur stark an XML an.

In früheren Versionen von ADO haben Entwickler hauptsächlich das Recordset-Objekt verwendet, um mit Daten aus dem Datenspeicher zu arbeiten. In ADO.NET ersetzt das DataSet-Objekt das Recordset-Objekt. Ein DataSet ist eine im Speicher befindliche Kopie der Daten, mit denen Sie arbeiten. Ein DataSet kann eine oder mehrere DataTables enthalten. Sie können sich ein DataSet als eine virtuelle relationale Datenbank vorstellen. DataSets sind völlig unabhängig von der ursprünglichen Datenquelle und sind nicht für die direkte Kommunikation mit der Datenquelle ausgelegt. Für die Kommunikation mit der Datenquelle verwendet ADO.NET verwaltete Provider.

ADO.NET verwendet zwei verwaltete Provider: Einen für die Verwendung mit SQL Server-Datenbanken und einen für beliebige OLE-DB-kompatible Datenbanken. In allen bisher erstellten Beispielen wurde der verwaltete Provider für SQL Server verwendet. Wenn Sie sich die Optionen unter Daten in der Toolbox ansehen, werden Sie drei Steuerelementpaare bemerken, die bis auf ihre Präfixe über identische Namen verfügen. Die drei Paare sind in der nachfolgenden Tabelle aufgelistet.

SQL Server

OLE DB

SqlDataAdapter

OLEDBDataAdapter

SqlDataConnection

OLEDBDataConnection

SqlCommand

OLEDBCommand

Die Steuerelemente mit dem Präfix OLEDB repräsentieren die verwalteten Provider für OLE DB und können für den Zugriff auf beliebige OLE-DB-kompatible Datenbanken verwendet werden. Sie sind den aktuellen ADO-Objekten ähnlich, wurden jedoch als verwalteter Code umgeschrieben, um innerhalb des .NET Frameworks zu funktionieren.

Die Steuerelemente mit dem Präfix SQL repräsentieren den verwalteten Provider für SQL Server und funktionieren nur mit SQL Server. Sie bieten eine Reihe von Vorteilen gegenüber ihren OLE DB-Entsprechungen. Zunächst verwendet dieses Objekt die systemeigene TDS-Schnittstelle (Tabular Data Stream), um eine maximale Leistung zu erreichen.

Die zusätzlichen, von OLE-DB-Objekten benötigten Schnittstellenebenen wurden entfernt.Diese Tatsache resultiert in einem schnelleren Datenbankzugriff. Zweitens verfügen die SQL-Objekte, die mit diesen Steuerelementen erstellt wurden, über zusätzliche Methoden, die SQL Server-spezifische Funktionen nutzen können. Dies bedeutet bei der Verwendung von SQL Server größere Flexibilität beim Entwurf und der Programmierung.

In der weiter oben erstellten Beispielanwendung wurde zwar ADO.NET verwendet, jedoch wurde ein Großteil der Programmierung von Visual Studio .NET automatisch erledigt. Wir mussten lediglich das DataSet und den Datenadapter über die Benutzeroberfläche der IDE konfigurieren. Als nächstes untersuchen wir den Microsoft Visual-Basic-.NET-Code, der erforderlich ist, um mit ADO.NET Daten in einer Tabelle auszuwählen, einzufügen, zu aktualisieren und zu löschen. Zunächst wird der Code für die Select-Anweisung untersucht.

Dim strCmdText As String
Dim rowsProcessed As Integer
Dim CustomerDS As New DataSet()
strCmdText = "Select * from Customers"
Dim SqlDataAdapter2 As New SqlDataAdapter(strCmdText, _
 "Data Source=localhost;Initial Catalog=ServiceCall;User 
   ID=sa;password=yourpassword")
SqlDataAdapter2.Fill(CustomerDS, "Customers")

In diesem Codebeispiel werden zunächst die zu verwendenden Variablen und Objekte definiert, einschließlich CustomersDS, bei dem es sich um ein ADO.NET-DataSet-Objekt handelt. Anschließend wird die Abfrage definiert, die das Dataset in der Variable strCmdText ausfüllt. Dann erfolgt die Definition eines ADO.NET-SqlDataAdapter-Objekts (SqlDataAdapter2), das die Abfrage- und die Datenbankverbindungszeichenfolge als Parameter liefert.

Beachten Sie, dass wir den verwalteten Provider für SQL Server von ADO.NET verwenden. Schließlich wird CustomerDS ausgefüllt und eine Tabelle innerhalb des DataSet mit der Bezeichnung Customers erstellt, indem die Fill-Methode des SqlDataAdapter-Objekts aufgerufen wird.

Da SqlDataAdapter2 mit der Abfrage- und Verbindungszeichenfolge definiert wurde, stellt die Fill-Methode eine Verbindung mit der SQL-Server-Datenbank her, führt die Abfrage aus und gibt die Ergebnisse an das DataSet zurück.

Als nächstes untersuchen wir den Code, der das Einfügen von Zeilen in eine Tabelle ermöglicht.

Dim strCmdText As String
 Dim rowsProcessed As Integer
 Dim sqlConn As New SqlConnection _
 ("Data Source=localhost;Initial Catalog=ServiceCall;User 
   ID=sa;password=yourpassword")
 strCmdText = "INSERT INTO Customers VALUES ('Cust4', 'Customer Four', " _
 & "'Cust4 Address', 'City', 'ST', '11111','(888)-123-4567')"
 Dim sqlCmd As New SqlCommand(strCmdText, sqlConn)
 sqlCmd.Connection.Open()
 rowsProcessed = sqlCmd.ExecuteNonQuery()

Zunächst werden die zu verwendenden Objekte und Variablen definiert. Anschließend wird ein ADO.NET-SqlConnection-Objekt erstellt (sqlConn) und die Verbindungszeichenfolge als Parameter übergeben. Als weiterer Schritt wird die Abfrage definiert, die die Zeilen in die Customers-Tabelle in der Variable strCmdText einfügt.

Dann erfolgt die Definition eines ADO.NET-SqlCommand-Objekts und die Übergabe der Abfrage und des SqlConnection-Objekts als Parameter. Anschließend wird die Verbindung mit dem SqlCommand-Objekt geöffnet und die ExecuteNonQuery-Methode aufgerufen. Die ExecuteNonQuery-Methode gibt die Anzahl der Zeilen zurück, die von der Databankoperation betroffen sind.

Mit Ausnahme der an das SqlCommand-Objekt übergebenen Abfrage ist der Code für die Aktualisierung und Löschung der Tabelle mit dem der Einfügeoperation identisch. Der Code wird zwar hier auch aufgeführt, jedoch in diesem Artikel nicht separat erläutert, da er mit dem Code für die Einfügeoperation identisch ist.
Der folgende Code aktualisiert eine Zeile in der Tabelle:

Dim strCmdText As String
 Dim rowsProcessed As Integer
 Dim sqlConn As New SqlConnection _
  ("Data Source=localhost;Initial Catalog=ServiceCall;User 
    ID=sa;password=yourpassword")
 strCmdText = "Update Customers Set CustomerName = 'Updated Customer' " _
   & "Where CustomerID = 'Cust4'"
 Dim sqlCmd As New SqlCommand(strCmdText, sqlConn)
 sqlCmd.Connection.Open()
 rowsProcessed = sqlCmd.ExecuteNonQuery()
Der folgende Code löscht eine Zeile in der Tabelle:
 Dim strCmdText As String
 Dim rowsProcessed As Integer
 Dim sqlConn As New SqlConnection _
  ("Data Source=localhost;Initial Catalog=ServiceCall;User ID=sa")
 strCmdText = "Delete Customers Where CustomerID = 'Cust4'"
 Dim sqlCmd As New SqlCommand(strCmdText, sqlConn)
 sqlCmd.Connection.Open()
 rowsProcessed = sqlCmd.ExecuteNonQuery()

Diese Beispiele demonstrieren die Verwendung der ExecuteNonQuery-Methode des SqlCommand-Objekts. Das SqlCommand-Objekte verfügt über eine Reihe anderer Methoden, einschließlich einer SQL Server-spezifischen Methode für die Verarbeitung von XML-Daten. Diese Funktionsweise wird im nächsten Beispiel untersucht.

 

XML und Visual Studio .NET

SQL Server 2000 verfügt über integrierter XML-Unterstützung. Eine Funktion ist die For XML-Klausel in der Select-Anweisung, die ein Resultset als XML zurückgibt. Das SqlCommand-Objekt verfügt über eine ExecuteXMLReader-Methode, die diese Funktionalität innerhalb SQL Server nutzen kann.
Das nächste Beispiel demonstriert eine weitere Verwendung des SqlCommand-Objekts. Darin wird die Tabelle Customers abgefragt, das Ergebnis als XML zurückgegeben und das XML in einem Textfeld auf einem Formular angezeigt.

So fragen Sie die Tabelle "Customers" ab und geben das Ergebnis als XML zurück

  1. Fügen Sie Ihrem Projekt ein neues Formular (Form3) hinzu, und fügen Sie darin ein Textfeld ein. Ändern Sie die MultiLine-Eigenschaft des Textfelds in True, die Width-Eigenschaft in 504, und die Height-Eigenschaft in 152 um (Siehe Abbildung 21).

    sql_builddbappsinvsnet_21_thumb

    Abbildung 21. Eigenschaftenseite für "TextBox"

  2. Fügen Sie dem Formular eine Schaltfläche hinzu, und ändern Sie ihre Eigenschaften Name und Text in XML abrufen um.

  3. Doppelklicken Sie auf die Schaltfläche, um das Codefenster für das Klickereignis zu öffnen, und fügen Sie den folgenden Code hinzu. Denken Sie daran, die Datenquelle, die Benutzer-ID und das Kennwort an Ihren Server anzupassen.

    Dim XMLTxtReader As Xml.XmlTextReader
    Dim StringBuilder As New System.Text.StringBuilder()
    Dim XMLOutput As String
    Dim SQLCommand As New System.Data.SqlClient.SqlCommand()
    Dim SQLServiceCallConn As New _
    System.Data.SqlClient.SqlConnection _
    ("Data Source=YourServer;Initial Catalog=ServiceCall;User 
    ID=xx;password=yourpassword")
    SQLServiceCallConn.Open()
    SQLCommand.Connection = SQLServiceCallConn
    SQLCommand.CommandType = CommandType.Text
    SQLCommand.CommandText = "Select CustomerID, CustomerName," _
    & "Phone from Customers for XML auto"
    'SQL ausführen und XML zurückgeben
    XMLTxtReader = SQLCommand.ExecuteXmlReader()
    StringBuilder.Append(XMLTxtReader.GetRemainder.ReadToEnd)
    XMLOutput = StringBuilder.ToString()
    Me.TextBox1.Text = XMLOutput
    
  4. Ihr Codefenster sollte der Abbildung 22 entsprechen (Datenquelle, Benutzer-ID und Kennwort sind unterschiedlich).

    sql_builddbappsinvsnet_22_thumb

    Abbildung 22. Formularklasse für Form3 mit Code für die "GetXML_Click"-Subroutine

In diesem Codebeispiel werden zunächst die zu verwendenden Objekte und Variablen definiert. Das XMLTextReader-Objekt enthält die von der Datenbank zurückgegebenen Daten. Das StringBuilder-Objekt wird zur Generierung einer XML-Zeichenfolge aus den Daten im XMLTextReader-Objekt verwendet.

Zunächst werden ein SqlConnection-Objekt (SQLServiceCallConn) erstellt und die Verbindungsparameter für die Datenbank übergeben. Anschließend werden die CommandType- und CommandText-Eigenschaften des SqlCommand-Objekts (SqlCommand) gesetzt. Beachten Sie, dass die For XML Auto-Anweisung in unserer Abfrage verwendet wird. Dadurch wird SQL Server angewiesen, die Ergebnisse der Abfrage als XML-Zeichenfolge zurückzugeben.

Anschließend verwenden wir die ExecuteXmlReader-Methode des SqlCommand-Objekts, um unsere Transact-SQL-Anweisung auszuführen. Diese Methode kann die systemeigene XML-Unterstützung von SQL Server nutzen und gibt ein XMLTextReader-Objekt zurück. Der letzte Schritt ist die Verwendung des StringBuilder-Objekts, um eine Zeichenfolge mit dem XML zu extrahieren, das SQL Server aus dem XMLTextReader-Objekt zurückgegeben hat.

Sie können die vollständig gekennzeichneten Namen für die StringBuilder-, SqlCommand-, und SqlConnection-Objekte verkürzen, indem Sie die System.Text- und System.Data.SqlClient-Namespaces importieren (siehe Abbildung 23). Dafür müssen Sie den folgenden Code oberhalb der Formularklassendefinition einfügen:

Imports System.Text
Imports System.Data.SqlClient

sql_builddbappsinvsnet_23_thumb

Abbildung 23. Quellcode mit Kurznotation zur Definition der "StringBuilder"- und "SqlConnection"-Objekte

Um die Anwendung zu testen, ändern Sie das Startobjekt in Form3 um, und laden Sie die Anwendung (drücken Sie F5). Klicken Sie auf XML abrufen. Der Inhalt der Customers-Tabelle wird als XML zurückgegeben und im Textfeld angezeigt (siehe Abbildung 24).

sql_builddbappsinvsnet_24_thumb

Abbildung 24. Ausgabe der Beispielanwendung

 

SQLXML 3.0 

Im vorangegangenen Abschnitt wurde die integrierte XML-Unterstützung von SQL Server erläutert. Dies wird manchmal als "SQLXML" bezeichnet. SQLXML 3.0 enthält die folgenden verwalteten Klassen, die die Arbeit mit SQLXML innerhalb Visual Studio .NET vereinfachen

Klasse

Beschreibung

SqlXmlCommand-Objekt

Gibt XML-Daten von SQL Server an ein neues oder vorhandenes Stream-Objekt zurück, oder gibt Daten an ein XMLReader-Objekt zurück. Dieses Objekt verfügt auch über eine Methode zur Erstellung von Parametern.

SqlXmlParameter-Objekt

Dieses Objekt dient zum Ausfüllen von Parametern, die mit dem SqlXMLCommand-Objekt erstellt wurden.

SqlXmlAdapter-Objekt

Dieses Objekt füllt ein DataSet aus XML-Daten von SQL Server. Es führt auch Aktualisierungen von SQL Server-Daten aus dem DataSet durch.

Diese verwalteten Klassen ermöglichen Ihnen die Bearbeitung von XML-Daten aus SQL Server. Dabei haben Sie folgende Möglichkeiten:

  • Ausführen von SQL-Abfragen zur Rückgabe von XML-Daten

  • Anwenden von XSL-Transformationen auf XML-Daten

  • Ausführen von XPath-Abfragen an XML-Daten

Für unsere letzte Beispielanwendung wird das vorangegangene Beispiel dahingehend erweitert, dass verwaltete SQLXML-Klassen für die Rückgabe von XML-Daten aus einer SQL-Abfrage verwendet werden.

Wichtig Damit diese Beispielanwendung funktioniert, muss SQLXML 3.0 installiert sein. Dies ist im SQL Server 2000 Web Services Toolkit enthalten, oder Sie können SQLXML 3.0 unter der folgenden Adresse downloaden: SQLXML and XML Mapping Technologies (in Englisch).
Vor der Verwendung von verwalteten SQLXML-Klassen muss dem Projekt der SQLXML-Komponentenverweis hinzugefügt werden.

So fügen Sie den SQLXML-Komponentenverweis hinzu

  1. Öffnen Sie den Projektmappen-Explorer, indem Sie im Menü Ansicht auf Projektmappen-Explorer klicken.

  2. Klicken Sie unter dem ServiceCall-Projekt mit der rechten Maustaste auf Verweise, und klicken Sie anschließend auf Verweis hinzufügen.

  3. Klicken Sie im Dialogfeld Verweis hinzufügen auf die Registerkarte .NET.

  4. Suchen Sie nach der Komponente mit der Bezeichnung Microsoft.Data.SqlXml, und heben Sie diese hervor.

  5. Klicken Sie auf Auswählen und anschließend auf OK.

  6. Speichern Sie das ServiceCall-Projekt.

  7. Öffnen Sie Form3.vb, und fügen Sie dem Formular eine neue Schaltfläche neben der Schaltfläche XML abrufen hinzu. Ändern Sie anschließend die Eigenschaften Name und Text der neuen Schaltfläche in SQLXML um.

  8. Doppelklicken Sie auf die Schaltfläche SQLXML, um das Codefenster für das Klickereignis zu öffnen, und fügen Sie den folgenden Code hinzu. Denken Sie daran, die Datenquelle, die Benutzer-ID und das Kennwort an Ihren Server anzupassen.

Dim strm As System.IO.Stream
Dim sqlXmlCmd As New Microsoft.Data.SqlXml.SqlXmlCommand _
 ("Provider=SQLOLEDB;Data Source=localhost;" _
 & "Initial Catalog=ServiceCall;User ID=sa;password=yourpassword")
sqlXmlCmd.CommandType = Microsoft.Data.SqlXml.SqlXmlCommandType.Sql
sqlXmlCmd.CommandText = ("Select CustomerID, CustomerName," _
  & "Phone from Customers for XML auto")
strm = sqlXmlCmd.ExecuteStream()
Dim streamRdr As New System.IO.StreamReader(strm)
Me.TextBox1.Text = streamRdr.ReadToEnd().ToString

In diesem Codebeispiel werden zunächst die zu verwendenden Objekte und Variablen definiert. Das Stream-Objekt (strm) enthält die XML-Daten, die von der Abfrage zurückgegeben werden. Anschließend wird das SqlXmlCommand-Objekt (sqlXmlCmd) definiert, wobei die Verbindungszeichenfolge als Parameter übergeben wird.
Als nächstes werden die Parameter für das SqlXmlCommand-Objekt gesetzt. CommandType wird auf Sql gesetzt. Diese Standardeinstellung wird hier aus Gründen der Übersichtlichkeit gezeigt. CommandText wird auf den Wert unserer Abfrage gesetzt. Hierbei handelt es sich um dieselbe Abfrage, die im ersten Teil dieses Beispiels verwendet wurde. Anschließend wird die ExecuteStream-Methode des SqlXmlCommand-Objekts aufgerufen, wodurch die SQL-Anweisung ausgeführt und die XML-Daten in das Stream-Objekt eingefügt werden.

Danach wird das StreamReader-Objekt (streamRdr) definiert, wobei das Stream-Objekt (strm) als Parameter übergeben wird. Auf diese Weise wird das StreamReader-Objekt mit den XML-Daten ausgefüllt. Im letzten Schritt laden wir das Textfeld mit den XML-Daten aus dem StreamReader-Objekt.
Das Startobjekt sollte nach wie vor auf Form3 gesetzt sein. Speichern Sie also das Projekt, führen Sie die Anwendung aus (drücken Sie [F5]), und klicken Sie auf die Schaltfläche SQLXML. Die Ausgabe sollte genau dieselbe wie beim Klicken auf die Schaltfläche XML abrufen sein (siehe Abbildung 24).

 

Datenbankprojekte

Visual Studio .NET ermöglicht Ihnen die Erstellung von Datenbankprojekten, die ein Repository für Skripts, Daten-Sicherungsdateien und Befehlsdateien liefern. Sie erstellen und verwalten Datenbankprojekte genau wie andere Visual Studio .NET-Projekte. Der Zugriff auf Datenbankprojekte erfolgt über den Projektmappen-Explorer, der eine hierarchische Ansicht aller Projekte innerhalb einer Projektmappe bietet.

So erstellen Sie ein Datenbankprojekt

  1. Öffnen Sie den Projektmappen-Explorer, indem Sie im Menü Ansicht auf Projektmappen-Explorer klicken.

  2. Klicken Sie mit der rechten Maustaste auf die Projektmappe 'ServiceCall', heben Sie Hinzufügen hervor, und klicken Sie anschließend auf Neues Projekt.

  3. Erweitern Sie unter Projekttypen: den Ordner Andere Projekte, und klicken Sie anschließend auf Datenbankprojekte.

  4. Klicken Sie unter Vorlagen auf die Vorlage Datenbankprojekte.

  5. Geben Sie dem Projekt den Namen ServiceCallDB, und klicken Sie anschließend auf OK.

    sql_builddbappsinvsnet_25_thumb

    Abbildung 25. Dialogfeld "Neues Projekt"

  6. Wählen Sie im Dialogfeld Datenbankverweis hinzufügen die Verbindung für die ServiceCall-Datenbank, und klicken Sie anschließend auf OK, um das Projekt zu erstellen.

    sql_builddbappsinvsnet_26

    Abbildung 26. Dialogfeld "Datenbankverweis hinzufügen"

 

Generieren von Skripts zum Erstellen und Exportieren von Daten 

Anmerkung Das Generieren von Skripts zum Erstellen erfordert Visual Studio .NET Enterprise Edition.

Das Tool Skripts zum Erstellen generieren ist eine weitere Funktion in Server-Explorer, die SQL Server-spezifisch ist. Das Tool ist dafür gedacht, die Arbeit von Entwicklern zu vereinfachen. Das Tool Skripts zum Erstellen generieren ermöglicht Ihnen die Umwandlung der gesamten Datenbank oder der ausgewählten Objekte innerhalb der Datenbank in eine Skriptdatei. Anschließend können Sie mit der Skriptdatei die Datenbank oder Objekte wiederherstellen oder die Datenbank auf einem anderen Server weitergeben.

Neben der Erstellung von Skripts können Sie auch Daten aus einzelnen Tabellen exportieren. Dies ist ein nützliches Tool während des Testens. Wird eine Tabelle während eines Tests, der eventuell mehrere Durchläufe benötigt, aktualisiert oder gelöscht, können die Daten aus der Tabelle in eine Datei exportiert und dann am Anfang jedes Tests wiederhergestellt werden, um einen einheitlichen Ausgangspunkt zu ermöglichen.

Um diese Funktionen zu demonstrieren, erstellen wir die Tabelle Customers als Skript und exportieren die Daten in eine Sicherungsdatei, damit ihr ursprünglicher Zustand wiederhergestellt werden kann.

So generieren Sie ein Skript

  1. Erweitern Sie in Server-Explorer unter Datenverbindungen den Knoten Tabellen, klicken Sie mit der rechten Maustaste auf die Tabelle Customers, und klicken Sie anschließend auf Skripts zum Erstellen generieren. Wenn Sie die integrierte Sicherheit von Windows 2000 oder Windows NT nicht verwenden, werden Sie eventuell aufgefordert, eine Benutzer-ID und ein Kennwort für den Computer einzugeben, auf dem SQL Server ausgeführt wird. Das Dialogfeld Skripts zum Erstellen generieren wird geöffnet (dies wird Benutzern von SQL Server Enterprise Manager sehr bekannt vorkommen).

  2. Das Dialogfeld enthält drei Registerkarten: Allgemein, Formatierung sowie Optionen. Akzeptieren Sie die Standardeinstellungen aller drei Registerkarten, und klicken Sie auf OK. Das Dialogfeld Ordner suchen wird angezeigt. Beachten Sie, dass Visual Studio .NET bereits den Ordner Create Scripts innerhalb des weiter oben erstellten Datenbankprojekts ausgewählt hat.

  3. Klicken Sie auf OK. Die Skripts für die Tabelle Customers werden erstellt und im Ordner Datenbankprojekte abgelegt.

  4. Die folgenden vier Dateien werden erstellt.

    Datei Beschreibung Dbo.Customers.tab Diese Datei enthält ein SQL-Skript zur Erstellung der Tabelle Dbo.Customers.kci Diese Datei enthält ein SQL-Skript zur Erstellung der Primärschlüssel und Indizes. Dbo.Customers.fky Diese Datei enthält ein SQL-Skript zur Erstellung der Fremdschlüssel. Dbo.Customers.ext Diese Datei enthält ein SQL-Skript zur Erstellung der erweiterten Eigenschaften

So exportieren Sie die Datentabelle in eine Datei

  1. Klicken Sie in Server-Explorer mit der rechten Maustaste auf die Tabelle Customers, und klicken Sie anschließend auf Daten exportieren. Das Dialogfeld Ordner suchen wird wiederum geöffnet und zeigt den Ordner Create Scripts innerhalb des Datenbankprojekts an.

  2. Klicken Sie auf OK. Die Daten in der Tabelle Customers werden in eine Datei mit der Bezeichnung Dbo.Customers.dat eingefügt.

 

Befehlsdatei des Datenbankprojekts

Wichtig Befehlsdateien setzen Visual Studio .NET Enterprise Edition voraus.

Mithilfe von Befehlsdateien können Sie mehrere Skripts in einem Datenbankprojekt in einem Befehl verpacken, wodurch die Verarbeitung mehrerer Skripts in einem Schritt vereinfacht wird.

So erstellen Sie eine Befehlsdatei

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Datenbankprojektordner, der die zu verpackenden Skripts enthält (in diesem Beispiel den Ordner Create Scripts).

  2. Klicken Sie auf Befehlsdatei erstellen. Das Dialogfeld Befehlsdatei erstellen wird angezeigt.

  3. Geben Sie der Datei die Bezeichnung RestoreCustomers.cmd.

  4. Wählen Sie den Authentifizierungstyp und die Skripts, die in die Datei aufgenommen werden sollen. Klicken Sie in diesem Beispiel auf Alle hinzufügen >> und anschließend auf Daten hinzufügen. Das Dialogfeld Daten hinzufügen wird angezeigt.

  5. Das Dialogfeld Daten hinzufügen zeigt alle Datendateien an, die für die Befehlsdatei zur Verfügung stehen. Wählen Sie Dbo.Customers.dat, und klicken Sie anschließend auf OK

  6. Klicken Sie im Dialogfeld Befehlsdatei erstellen auf OK. Die Datei RestoreCustomers.cmd wird in den Ordner Create Scripts eingefügt.

So führen Sie die Befehlsdatei aus

  • Klicken Sie im Datenbankprojekt mit der rechten Maustaste auf die Befehlsdatei, und klicken Sie anschließend auf Ausführen.

Anmerkung Befehlsdateien funktionieren nur mit Windows 2000 Server und höher.

 

Schlussfolgerung

Die Beispiele in diesem Whitepaper demonstrieren die Leistungsfähigkeit der Datenbanktools, die in der IDE von Visual Studio .NET integriert sind. Ohne die IDE von Visual Studio .NET verlassen zu müssen, waren wir in der Lage, eine vollständige Anwendung zu erstellen, die eine Datenbank, benutzerdefinierte Funktionen, gespeicherte Prozeduren und Anwendungscode enthält.

Darüber hinaus konnte auch ein Debugging von gespeicherten Prozeduren auf Quelltextebene mit denselben umfassenden Debugtools durchgeführt werden, die auch in der Visual-Studio-.NET-IDE enthalten sind. Visual Studio .NET stellt Ihnen die Tools zur Verfügung, mit denen Sie bessere Anwendungen schneller erstellen können.

Anhang 1: Datenbank-Ladeskripts
Um die Tabellen in der ServiceCall-Datenbank mit den Beispieldaten zu füllen, führen Sie die folgenden Datenbank-Ladeskripts in SQL Query Analyzer aus.

Use ServiceCall
Insert into Customers 
values('cust1','Customer One','123 Main St.','Chicago','IL','60601','(312) 
  555-1212')
Insert into Customers 
values('cust2','Customer Two','248 Elm 
  St.','Serverville','IL','60679','(872) 555-4519')
Insert into Customers 
values('cust3','Customer Three','831 First 
  St.','Netville','IL','60831','(763) 555-6728')
Insert into ServiceCall (CustomerID, ServiceDate, LaborRate, Hours, 
  PartsCost)
values('cust1','Sep 14 2001 12:00AM', 55.00, 3, 200.00)
Insert into ServiceCall (CustomerID, ServiceDate, LaborRate, Hours,
  PartsCost)
values('cust1','Sep 17 2001 12:00AM', 55.00, 1.5, 70.00)
Insert into ServiceCall (CustomerID, ServiceDate, LaborRate, Hours,
  PartsCost)
values('cust1','Sep 19 2001 12:00AM', 55.00, 2, 0.00)
Insert into ServiceCall (CustomerID, ServiceDate, LaborRate, Hours,
  PartsCost)
values('cust2','Sep 25 2001 12:00AM', 60.00, 3.5, 180.00)
Insert into ServiceCall (CustomerID, ServiceDate, LaborRate, Hours,
  PartsCost)
values('cust3','Sep 27 2001 12:00AM', 65.00, 4.5, 275.00

Anhang 2: Weitere Informationen
Weitere Informationen zu den Microsoft .NET-Technologien finden Sie in den folgenden Websites

  • Visual Studio .NET

  • Web Services (in Englisch)

  • SQL Server

  • SQL Server and XML (in Englisch)