Veröffentlicht: 05. Feb 2002 | Aktualisiert: 14. Jun 2004
Von Paul Cornell
Microsoft® Office bietet mehrere Features und Tools zum Speichern und Verwalten von Daten, z.B. Data Access Objects (DAO), ActiveX® Data Objects (ADO), Microsoft Word-Seriendrucke, Microsoft Excel-Webabfragen, Microsoft Query, Datenzugriffsseiten, Microsoft Access-Datenprojekte, Office-Datenverbindungen, Office-Datenverknüpfungen usw. Die Microsoft .NET-Plattform stellt zusätzliche Datenzugriffsfeatures und -tools bereit, z.B. ADO.NET, .NET-Datenverbindungen und Datenbankprojekte.
In dieser Kolumne wird beschrieben, wie Sie Ihre Microsoft Access-Daten mit Microsoft Visual Studio® .NET, Microsoft Visual Basic® .NET und insbesondere ADO.NET freigeben und verwalten können.
Auf dieser Seite
Bestimmen, wann ADO.NET die beste Wahl ist
Erste Schritte in ADO.NET
Kann ich ADO.NET in Office VBA verwenden?
Verwenden der Visual Studio .NET-Datenzugriffstools
Datenverbindungen
Datenbankprojekte
DataForm-Assistent
Erweiterte ADO.NET-Codebeispiele
Zugreifen auf schreibgeschützte, vorwärtsgerichtete Daten mit dem "DataReader"-Objekt
Arbeiten mit DataSets unter Verwendung der Objekte "DataAdapter", "DataSet", "DataTable", "DataRow" und "DataColumn"
Weitere Informationen
Bestimmen, wann ADO.NET die beste Wahl ist
Office stellt ein umfassendes Spektrum an Datenzugriffsfeatures und -tools bereit. Warum kann Office also nicht zur Verwaltung von Office-Daten verwendet werden? In vielen Fällen ist es durchaus sinnvoll, die integrierten Office-Features und -Tools für bestimmte datenspezifische Aufgaben zu verwenden. Allerdings bietet ADO.NET - im Gegensatz zu der Vielzahl an Dateneinstiegspunkten und Datenzugriffsbibliotheken in Office - eine einheitliche Methode zum Hinzufügen von Datenverbindungen und Codieren von Datenlösungen.
Obwohl Sie bei Bedarf weiterhin ADO-Funktionen in Visual Studio .NET und Visual Basic .NET aufrufen können, ist ADO.NET in vielerlei Hinsicht eine bessere Datenzugriffslösung als ADO:
-
ADO.NET ermöglicht es, mehrere Tabellen in ein DataSet einzufügen, einschließlich der Beziehungen zwischen diesen Tabellen. ADO unterstützt nur eine Ergebnistabelle (obwohl diese einzelne Ergebnistabelle das Ergebnis einer JOIN-Aktion sein kann, die für mehrere verwandte Tabellen durchgeführt wurde).
-
ADO.NET ermöglicht einen Zugriff auf getrennte Daten. ADO bietet auch Zugriff auf getrennte Daten, wurde aber in erster Linie für den Zugriff auf verbundene Daten entworfen.
-
ADO.NET stellt ein Datensatznavigationsparadigma bereit, das Ihnen den Zugriff auf Daten in beliebiger Reihenfolge (im Gegensatz zu den sequenziellen Move-Methoden in ADO) und das Traversieren in Datentabellen unter Verwendung ihrer Beziehungen ermöglicht.
-
Da ADO.NET Daten mit Hilfe von XML übermittelt, können Sie komplexere Datentypen als in ADO bereitstellen und Daten durch Firewalls übergeben. Darüber hinaus wird die Datenzugriffsleistung verbessert.
-
ADO.NET wurde speziell für das Arbeiten mit Microsoft SQL Server 7.0- und Microsoft SQL Server 2000-Datenbanken entwickelt. Dies spiegelt sich in den ADO.NET Sql-Objekten wider. Zudem ermöglicht ADO.NET einen programmtechnischen Zugriff auf andere OLE DB-Datenquellen, z.B. Microsoft Access-Datenbanken, wie die ADO.NET OleDb-Objekte zeigen.
Wenn Sie die vielen neuen Features in .NET nutzen möchten, sollten Sie die .NET-Datenzugriffsfeatures und -tools verwenden (weitere Informationen zur .NET-Plattform finden Sie in meiner Kolumne Introducing .NET to Office Developers [in Englisch]).
Erste Schritte in ADO.NET
Abbildung 1 zeigt die Hauptobjekte, die Sie verwenden werden, wenn Sie erstmals mit ADO.NET arbeiten. (Quelle: Inside .NET Managed Providers [in Englisch])
Abbildung 1. Hauptobjekte im ADO.NET-Objektmodell
Zu diesen Objekten gehören:
-
Die Objekte OleDbConnection und SqlConnection, die Verbindungen zu Datenbanken darstellen und mit einem ADO-Connection-Objekt vergleichbar sind.
-
Die Objekte OleDbCommand und SqlDbCommand, die Zeichenfolgen von SQL-Text darstellen, die direkt an eine Datenbank ausgegeben werden, und mit einem ADO-Command-Objekt vergleichbar sind.
-
Die Objekte OleDbDataAdapter und SqlDataAdapter, die folgende Datenbankbefehle enthalten: SELECT, INSERT, UPDATE und DELETE. Diese Objekte dienen als Verbindungsglieder zwischen Datenbanken und DataSet-Objekten. Sie verwenden die Fill-Methode, um ein DataSet-Objekt zu füllen und von einer Datenbank zu trennen, und Sie verwenden die Update-Methode, um das Objekt wieder mit der Datenbank zu verbinden und die am DataSet-Objekt vorgenommenen Änderungen wieder in der Datenbank zu speichern.
-
Das DataSet-Objekt enthält eine Kopie der tatsächlichen Daten, ähnlich wie ein getrenntes ADO-Recordset-Objekt. Ein DataSet-Objekt kann die Objekte DataRelation und Constraint enthalten, die die Beziehungen zwischen Datentabellen und den Datenbeschränkungen in diesen Tabellen darstellen. Zudem kann ein DataSet-Objekt DataTable-Objekte enthalten, die wiederum DataColumn- und DataRow-Objekte enthalten können. Unter Verwendung der Objekte DataTableMapping und DataColumnMapping kann ein DataSet Tabellen und Spalten in einer Datenbank ihren jeweiligen DataTable- und DataColumn-Objekten zuordnen.
-
Die Objekte SqlDataReader und OleDbReader stellen verbundene, vorwärtsgerichtete, schreibgeschützte Datenleser dar. Dies ist von Nutzen, wenn Sie eine konstante Verbindung zu einer Datenbank aufrechterhalten können und nur Daten lesen und nicht ändern möchten, da Sie in diesem Fall kein DataSet-Objekt erstellen müssen. Ein Datenleser ist mit einem verbundenen, vorwärtsgerichteten, schreibgeschützten ADO-Recordset-Objekt vergleichbar.
Der folgende Beispielcode bezieht sich auf die Verwendung von ADO in Office VBA (Visual Basic für Applikationen). Mit diesem Code können Sie die Access-Beispieldatenbank Nordwind öffnen, Daten aus der Tabelle Artikel in das Recordset-Objekt kopieren und einen Bericht über die Daten im ersten Datensatz des Recordsets erstellen:
' Office VBA- und ADO-Code - ADOCode.bas.
Public Sub ADOExample()
' Zunächst Verweis auf ADO-Bibliothek festlegen.
Dim objConn As ADODB.Connection
Dim objRS As ADODB.Recordset
Set objConn = New ADODB.Connection
objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"User ID=Admin;" & _
"Data Source=C:\Programme\Microsoft " & _
"Office\Office10\Samples
ordwind.mdb"
objConn.Open
Set objRS = objConn.Execute("SELECT * FROM Artikel")
objRS.MoveFirst
MsgBox Prompt:=objRS.Fields("ProductName").Value & ", " & _
objRS.Fields("UnitsInStock").Value
objRS.Close
objConn.Close
End Sub
Dieser ADO-Code ist einfach, wenn Sie bereits zuvor in ADO codiert haben:
-
Die Variablen der ADO-Objekte Connection und Recordset sind deklariert. Diese Variablen verweisen auf eine Verbindung zu einer Datenbank bzw. zu den Daten, die dieser Datenbank zugrunde liegen.
-
Die ConnectionString-Eigenschaft des Connection-Objekts ist auf einen datenbankspezifischen String-Wert gesetzt, der Informationen repräsentiert, die für eine Datenbankverbindung erforderlich sind (in diesem Beispiel die Datenbank Nordwind).
-
Die Open-Methode des Connection-Objekts stellt die tatsächliche Verbindung zur Datenbank her.
-
Die Execute-Methode des Connection-Objekts ruft Daten aus der Datenbank ab und platziert die abgerufenen Daten in das Recordset-Objekt.
-
Die MoveFirst-Methode des Recordset-Objekts verschiebt den ersten Datensatz in das Recordset.
-
Die Fields-Eigenschaft des Recordset-Objekts verweist auf eine bestimmte Spalte im Datensatz, und die Value-Eigenschaft des Field-Objekts ruft die tatsächlichen Daten im Feld ab.
Zum Vergleich ist im Folgenden ein Visual Basic .NET-Beispielcode für eine Konsolenanwendung aufgeführt, die im Wesentlichen dieselben Aktionen unter Verwendung von ADO.NET ausführt. In diesem Beispiel werden die Daten jedoch nicht in einem Recordset platziert, sondern ein ADO.NET-Datenleser bleibt mit den Daten verbunden:
' Visual Basic .NET- und ADO.NET-Code - ADONETCode.vb.
' Unter Verwendung eines Zugriffs auf verbundene ADO.NET-Daten.
' Konsolenanwendung.
Imports System.Data.OleDb
Module Module1
Sub Main()
' Zunächst Verweis auf System.Data.dll festlegen.
Dim objConn As New OleDbConnection _
("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"User ID=Admin;" & _
"Data Source=C:\Programme\Microsoft" & _
"Office\Office10\Samples
ordwind.mdb")
objConn.Open()
Dim objCmd As New OleDbCommand _
("SELECT * FROM Artikel", objConn)
Dim objDataReader As OleDbDataReader = objCmd.ExecuteReader
objDataReader.Read()
Console.Write(objDataReader.Item("ProductName") & ", " & _
objDataReader.Item("UnitsInStock"))
End Sub
End Module
So funktioniert der Code:
-
Mit dem Code
Imports System.Data.OleDb
wird die Anzahl der Tastenanschläge, die für den Zugriff auf ein Objekt oder die Elemente eines Objekts erforderlich sind, reduziert. Sie könnten z.B.
ADODB.Recordset
in ADO codieren. Da Sie aber die ADODB-Bibliothek referenziert haben, ist dies nicht notwendig. Ebenso könnten Sie
System.Data.OleDb.OleDbConnection
in ADO.NET codieren. Das ist aber nicht erforderlich, wenn Sie bereits den mit dem OleDbConnection-Objekt verbundenen Namespace System.Data.OleDb importiert haben (vorausgesetzt, es wurde zuvor ein Verweis auf System.Data.dll gesetzt).
-
In ADO mussten wir zunächst ein Objekt des Typs Connection deklarieren und dann die ConnectionString-Eigenschaft verwenden, um Verbindungsinformationen zu definieren. In .NET verwenden wir die Konzepte von parametrisierten Konstruktoren und Initialisierern, um ein Objekt vom Typ OleDbConnection zu deklarieren und die Verbindungsinformationen in nur einer Codezeile zu definieren.
-
Ähnlich wie bei ADO verwenden wir in ADO.NET die Open-Methode des OleDbConnection-Objekts, um die tatsächliche Datenbankverbindung herzustellen.
-
Als Nächstes deklarieren wir ein ADO.NET-OleDbCommand-Objekt, um den Befehl zum Abrufen von Daten aus der Datenbank zu speichern.
-
Dann deklarieren wir ein ADO.NET-OleDbDataReader-Objekt, um die Daten aus der Datenbank zu lesen.
-
Unter Verwendung der ExecuteReader-Methode des OleDbCommand-Objekts kann der Code dem Datenleser ermöglichen, auf spezifische Daten in der Datenbank zuzugreifen.
-
Die Read-Methode des OleDbDataReader-Objekts liest den ersten Datensatz in der Datenbank.
-
Die Console.Write-Methode ruft Daten mit Hilfe der Item-Eigenschaft des OleDbReader-Objekts aus bestimmten Spalten ab und schreibt sie in das Befehlsfenster.
Der folgende Visual Basic .NET-Beispielcode stellt eine Alternativlösung dar. Der Code führt dieselben Aktionen wie das vorherige ADO.NET-Beispiel aus, aber in diesem Fall werden die Daten in ein ADO.NET-DataSet kopiert, und dann wird die Verbindung zur Datenbank getrennt:
' Visual Basic .NET- und ADO.NET-Code - ADONETCode.vb.
'
' Unter Verwendung eines Zugriffs auf getrennte ADO.NET-Daten.
' Konsolenanwendung.
Imports System.Data.OleDb
Module Module1
Sub Main()
' Zunächst Verweis auf System.Data.dll festlegen.
Dim objConn As New OleDbConnection _
("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"User ID=Admin;" & _
"Data Source=C:\Programme\Microsoft" & _
"Office\Office10\Samples
ordwind.mdb")
objConn.Open()
Dim objAdapter As New OleDbDataAdapter _
("SELECT * FROM Artikel", objConn)
Dim objDataSet As New DataSet()
objAdapter.Fill(objDataSet)
With objDataSet.Tables("Table").Rows(0)
Console.Write(.Item("ProductName") & ", " _
& .Item("UnitsInStock"))
End With
End Sub
End Module
Im Folgenden wird aufgeführt, wie sich dieser Code vom vorherigen ADO.NET-Beispiel unterscheidet:
-
Das OleDbAdapter-Objekt ist insofern mit dem OleDbDataReader-Objekt vergleichbar, als dass es auf Daten in einer Datenbank zugreift. Der Unterschied besteht aber darin, dass die Fill-Methode des OleDbAdapter-Objekts verwendet wird, um die Datentabellen und Beziehungen aus der Datenbank in das DataSet-Objekt zu kopieren.
-
Die Tables-Eigenschaft des DataSet-Objekts greift auf Tabellen des DataSets zu, während die Rows-Eigenschaft auf einzelne Zeilen einer bestimmten Tabelle im DataSet zugreift.
Kann ich ADO.NET in Office VBA verwenden?
Obwohl Sie ggf. neue ADO.NET-Features in Verbindung mit Office VBA verwenden möchten, ist dies derzeit nicht möglich. Der Grund hierfür ist folgender: Wenn Sie RegAsm.exe (das Assemblyregistrierungstool im .NET Framework-SDK) ausführen, um System.Data.dll für COM zu registrieren (Office VBA basiert auf COM) und dann versuchen, aus Office auf die generierte Typbibliotheksdatei zu verweisen, werden im Visual Basic-Objektbrowser in Office keine Elemente offen gelegt. Dies liegt daran, dass COM keine privaten ADO.NET-Kernelemente und parametrisierten Konstruktoren erkennen kann. Daher sollten Sie zunächst weiterhin ADO in Office VBA verwenden.
Verwenden der Visual Studio .NET-Datenzugriffstools
Visual Studio .NET stellt viele benutzerfreundliche Tools für den Zugriff auf Office-Daten bereit, u.a. Erstellung von wieder verwendbaren Datenverbindungen und Datenbankprojekten und die Bereitstellung eines DataForm-Assistenten.
Datenverbindungen
Mit Hilfe von Datenverbindungen können Sie die Datenbankverbindungsdetails einmalig definieren und diese Informationen dann in mehreren Lösungen wieder verwenden. Das folgende Beispiel zeigt, wie Sie in Visual Studio .NET eine wieder verwendbare Datenverbindung erstellen können:
-
Klicken Sie im Menü Extras auf Mit Datenbank verbinden. Das Dialogfeld Datenverknüpfungseigenschaften wird angezeigt.
-
Klicken Sie auf der Registerkarte Provider auf den entsprechenden Datenprovider, und klicken Sie dann auf Weiter. Klicken Sie z.B. auf Microsoft Jet 4.0 OLE DB Provider, wenn Sie auf die Beispieldatenbank Nordwind in Access zugreifen möchten.
-
Geben Sie auf der Registerkarte Verbindung spezifische Informationen zum ausgewählten Datenprovider ein. Klicken Sie für die Beispieldatenbank Nordwind z.B. neben dem Feld Geben Sie den Datenbanknamen ein, oder wählen Sie einen aus: auf die Schaltfläche ... und dann auf Öffnen.
-
Klicken Sie auf Verbindung testen. Wenn die Verbindung hergestellt wird, klicken Sie auf OK. Wenn keine Verbindung hergestellt wird, überprüfen Sie nochmals die Informationen auf der Registerkarte Verbindung.
-
Klicken Sie auf OK, um das Dialogfeld Datenverknüpfungseigenschaften zu schließen.
Sie verfügen jetzt über eine wieder verwendbare Datenverbindung, die Sie ihren Visual Studio .NET-Projekten hinzufügen können.
Das folgende Beispiel, das auf diesen Schritten aufbaut, veranschaulicht, wie Sie ADO.NET-Objekte erstellen können, die mit vorhandenen Datenverbindungen im Fenster Server-Explorer interagieren:
-
Klicken Sie in der Ansicht Designer eines Windows-Anwendung-Projekts im Menü Ansicht auf Server-Explorer, erweitern Sie die gewünschte Datenverbindung, und ziehen Sie eine Tabelle, Sicht oder gespeicherte Prozedur auf die Entwurfsoberfläche. Visual Studio .NET erstellt ein OleDbConnection/SqlConnection-Objekt (abhängig vom Datenbanktyp), ein OleDbDataAdapter/SqlDataAdapter-Objekt und vier OleDbCommand/SqlCommand-Objekte zum Markieren, Einfügen, Aktualisieren und Löschen von Daten.
-
Klicken Sie mit der rechten Maustaste auf das OleDbDataAdapter/SqlDataAdapter-Objekt und dann auf DataSet generieren. Wählen Sie in diesem Fall Neu, behalten Sie die Standardeinstellung von DataSet1 bei, und aktivieren Sie die Tabellen, die Sie dem DataSet hinzufügen möchten. Aktivieren Sie dann DataSet zu Designer hinzufügen, und klicken Sie auf OK. Visual Studio .NET erstellt ein DataSet-Objekt.
-
Klicken Sie mit der rechten Maustaste auf das OleDbDataAdapter/SqlDataAdapter-Objekt, und klicken Sie auf Datenvorschau. Klicken Sie auf DataSet füllen und dann auf Schließen. Anmerkung In Visual Studio .NET Beta 2 wird die Schaltfläche DataSet füllen, mit der der Code zum Füllen des DataSet-Objekts generiert wird, nicht angezeigt. Sie müssen den Code ggf. manuell zum Form_Load- oder Page_Load-Ereignis hinzufügen, z.B. folgenden Code:
Me.OleDbDataAdapter1.Fill(DataSetName11)
Das folgende Beispiel zeigt, wie Sie ein Datenblatt auf einem Windows Form hinzufügen können, das mit einem vorhandenen DataSet verknüpft ist, welches im vorherigen Beispiel generiert wurde:
-
Klicken Sie in der Ansicht Designer in der Toolbox auf die Registerkarte Windows Forms, und doppelklicken Sie dann auf DataGrid.
-
Wählen Sie im Fenster Eigenschaften für DataGrid1 den Eintrag DataSet11 für die DataSource-Eigenschaft, und wählen Sie dann die Tabelle für die DataMember-Eigenschaft.
-
Führen Sie die Anwendung aus.
-
Wenn im DataGrid1 keine Daten angezeigt werden, fügen Sie dem Form_Load-Ereignis Code hinzu, der mit dem folgenden Code vergleichbar ist:
Me.OleDbDataAdapter1.Fill(DataSetName11)
. Tipp Führen Sie folgende Schritte aus, wenn Sie im Fenster Server-Explorer ADO.NET-Objekte ohne vorhandene Datenverbindungen erstellen möchten:
-
Klicken Sie in der Entwurfsansicht in der Toolbox auf die Registerkarte Daten (dies funktioniert nicht in der Codeansicht).
-
Ziehen Sie ein ADO.NET-Objekt auf die Entwurfsoberfläche.
-
Klicken Sie mit der rechten Maustaste auf das ADO.NET-Objekt und dann auf Eigenschaften.
-
Füllen Sie die entsprechenden Eigenschaften für das ausgewählte ADO.NET-Objekt aus.
Datenbankprojekte
Mit Visual Studio .NET-Datenbankprojekten können Sie in kurzer Zeit datenbankorientierte Lösungen erstellen. Das folgende Beispiel zeigt, wie Sie in Visual Studio .NET ein Datenbankprojekt erstellen können:
-
Zeigen Sie im Menü Datei auf Neu, und klicken Sie auf Projekt.
-
Erweitern Sie im Bereich Projekttypen den Zweig Andere Projekte, und klicken Sie auf Datenbankprojekte.
-
Klicken Sie im Bereich Vorlagen auf Datenbankprojekt.
-
Geben Sie in den Feldern Name und Speicherort die entsprechenden Informationen ein, und klicken Sie auf OK.
-
Klicken Sie auf die Schaltfläche Zu Projektmappe hinzufügen oder Projektmappe schließen, um dieses Projekt einer vorhandenen Projektmappe hinzuzufügen bzw. um eine eigenständige Lösung zu erstellen.
-
Wählen Sie im Dialogfeld Datenbankverweis hinzufügen eine vorhandene Datenverbindung, oder klicken Sie auf Neuen Verweis hinzufügen, um eine neue Datenverbindung hinzuzufügen. Wenn Sie auf Neuen Verweis hinzufügen klicken, führen Sie die im vorherigen Abschnitt aufgeführten Schritte aus, um im Dialogfeld Datenverknüpfungseigenschaften die entsprechenden Informationen einzugeben (wenn Sie mit dieser Methode eine neue Datenverbindung hinzufügen, wird die Datenverbindung im Fenster Server-Explorer angezeigt).
DataForm-Assistent
Mit dem DataForm-Assistent in Visual Studio .NET können Sie in kürzester Zeit eine Verbindung zu einer Datenbank herstellen und eine einfache Benutzeroberfläche zum Anzeigen von und Interagieren mit Daten erstellen. So können Sie den DataForm-Assistenten verwenden:
-
Klicken Sie in einem Windows-Anwendung-Projekt im Menü Projekt auf Windows Form hinzufügen.
-
Klicken Sie im Bereich Vorlagen auf DataForm-Assistent. Klicken Sie dann auf Öffnen und Weiter.
-
Geben Sie DataSet1 im Feld Ein neues DataSet mit folgendem Namen erstellen ein, und klicken Sie auf Weiter.
-
Wählen Sie eine vorhandene Datenverbindung, oder erstellen Sie eine neue Datenverbindung. Klicken Sie auf Weiter.
-
Wählen Sie die Elemente aus, die Sie zu DataSet1 hinzufügen möchten, und klicken Sie auf Weiter.
-
Wenn Sie mehr als ein Element ausgewählt haben, definieren Sie die Beziehungen zwischen den Elementen, und klicken Sie auf Weiter.
-
Definieren Sie die Tabellen und Spalten, die auf dem Formular angezeigt werden sollen, und klicken Sie auf Weiter.
-
Wählen Sie die Optionen für den Anzeigestil aus, und klicken Sie auf Fertig stellen. Anmerkung Stellen Sie sicher, dass Sie das neue Datenformular als Startformular festgelegt haben (klicken Sie im Menü Projekt auf Eigenschaften. Erweitern Sie den Ordner Allgemeine Eigenschaften, klicken Sie auf Allgemein, markieren Sie das Datenformular in der Liste Startobjekt, und klicken Sie dann auf OK).
Anmerkung Stellen Sie sicher, dass die Daten in DataSet1 an das Datenformular gebunden sind, indem Sie den folgenden Code in das Load-Ereignis des Datenformulars einfügen:
Me.OleDbDataAdapter1.Fill(objDataSet1)
-
Führen Sie die Anwendung aus (klicken Sie im Menü Debuggen auf Ausführen).
Erweiterte ADO.NET-Codebeispiele
Für einen besseren Einblick in den ADO.NET-Code möchte ich die Kolumne dieses Monats mit einigen erweiterten Codebeispielen abschließen, die ich in ADO.NET erstellt habe.
Zugreifen auf schreibgeschützte, vorwärtsgerichtete Daten mit dem "DataReader"-Objekt
Oftmals möchten Sie einfach nur einen Datenstrom ausgeben und sich weder in den Daten vor- und zurückbewegen noch die Daten ändern. Das ADO.NET-DataReader-Objekt wurde speziell für diesen Zweck entworfen. Der folgende Beispielcode durchläuft alle ausgewählten Daten in einer verbundenen Datenbank:
' Visual Basic .NET-Code.
' Konsolenanwendung.
.
' Verweise:
' System
' System.Data
' System.XML
Imports System.Data.OleDb ' Für OleDb-Objekte.
Imports Microsoft.VisualBasic.ControlChars ' Für CrLf-Konstante.
Module Module1
Sub Main()
' OleDbConnection,- OleDbCommand- und
' OleDbDataReader-Objekte erstellen und initialisieren.
Dim objConn As New _
OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"User ID=Admin;" & _
"Data Source=C:\Programme\Microsoft" & _
"Office\Office10\Samples
ordwind.mdb")
objConn.Open()
' Befehl ausführen und Datenleser an ausgewählte
' Daten anfügen.
Dim objCmd As New OleDbCommand("SELECT * FROM Artikel", _
objConn)
Dim objReader As OleDbDataReader = objCmd.ExecuteReader
' Daten lesen und Werte auflisten.
Call ReadData(objReader)
End Sub
Public Sub ReadData(ByVal objReader As OleDbDataReader)
' Zweck: Datenwerte für einen bestimmten Datenleser auflisten.
' Akzeptiert: objReader - Der Datenleser.
Dim intField As Integer ' Aktuelles Feld in Zeile.
Dim intColumn As Integer ' Name der aktuellen Spalte.
Dim blnColumns As Boolean = False ' Prüft, ob Spaltennamen
' aufgelistet wurden.
With objReader
' Liest jeweils eine Zeile, bis das Ende der Datei erreicht wird.
Do While .Read = True
For intField = 0 To .FieldCount - 1
' Zuerst Spaltennamen auflisten.
If blnColumns = False Then
For intColumn = 0 To .FieldCount - 1
If intColumn = .FieldCount - 1 Then
Console.Write(.GetName(intColumn) & _
CrLf)
Else
Console.Write(.GetName(intColumn) & _
", ")
End If
Next intColumn
' Spaltennamen nur einmal auflisten.
blnColumns = True
End If
' Wert jedes Felds in der aktuellen Zeile auflisten.
If intField = .FieldCount - 1 Then
Console.Write(.Item(intField) & CrLf)
Else
Console.Write(.Item(intField) & ", ")
End If
Next intField
Loop
End With
' Anhalten, damit der Benutzer die Daten im Konsolenfenster sehen kann.
Console.Write("Drücken Sie eine beliebige Taste, um fortzufahren...")
Console.Read()
End Sub
End Module
So funktioniert der Code:
-
Wie Sie bereits in einem der oberen Beispiele gesehen haben, wird mit dem Imports-Code (z.B.
Imports System.Data.OleDb
) die Anzahl der Tastenanschläge, die für den Zugriff auf ein Objekt oder die Elemente dieses Objekts erforderlich sind, reduziert. Entsprechend werden die Objekte OleDbConnection, OleDbCommand und OleDbDataReader deklariert und initialisiert, um die Datenbankverbindung, Datensätze bzw. Datensatzcursor darzustellen. Die ReadData-Unterroutine bildet das Kernstück dieses Codes.
-
Die Schleife Do verwendet die Read-Methode des OleDbDataReader-Objekts, um jeweils eine Zeile von Daten zu lesen, bis die Methode den Wert FALSE zurückgibt (dies bedeutet, dass alle Daten gelesen wurden).
-
Die FieldCount-Eigenschaft des OleDbDataReader-Objekts gibt die Anzahl der Datenfelder (Spalten) in der Datenzeile zurück. Wenn es sich um die erste Datenzeile handelt, wird die GetName-Eigenschaft des OleDbDataReader-Objekts für die Spalte aufgerufen, um den Namen der Spalte zurückzugeben.
-
Die Item-Eigenschaft des OleDbDataReader-Objekts verwendet eine Indexnummer in Verbindung mit der FieldCount-Eigenschaft, um den Wert jedes Datenfelds in der Datenzeile zurückzugeben.
Arbeiten mit DataSets unter Verwendung der Objekte "DataAdapter", "DataSet", "DataTable", "DataRow" und "DataColumn"
Das ADO.NET-DataSet-Objekt wurde für das Arbeiten mit getrennten Daten entworfen. Sie können die Struktur und Daten einer ganzen Datenbank - Tabellen, Zeilen, Spalten, Felder und sogar Beziehungen - in einem DataSet imitieren. Wenn Sie das Arbeiten mit den Daten abgeschlossen haben, können Sie die Daten im DataSet mit den Daten in der ursprünglichen Datenbank synchronisieren. Der folgende Beispielcode durchläuft alle Daten in einem getrennten DataSet:
' Visual Basic .NET-Code.
' Konsolenanwendung.
.
' Verweise:
' System
' System.Data
' System.XML
Imports System.Data.OleDb ' Für OleDb-Objekte.
Imports Microsoft.VisualBasic.ControlChars ' Für CrLf-Konstante.
Module Module1
Sub Main()
' OleDbDataAdapter- und DataSet-Objekte erstellen und initialisieren.
Dim objAdapter As New OleDbDataAdapter _
("SELECT * FROM Artikel", _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"User ID=Admin;" & _
"Data Source=C:\Programme\Microsoft" & _
"Office\Office10\Samples
ordwind.mdb")
Dim objDataSet As New DataSet()
' Ausgewählte Daten in ein DataSet kopieren.
objAdapter.Fill(objDataSet)
' Datenwerte in einem DataSet auflisten.
Call ListData(objDataSet)
End Sub
Public Sub ListData(ByVal objDataSet As DataSet)
' Zweck: Datenwerte für ein bestimmtes DataSet auflisten.
' Akzeptiert: objDataSet - Das DataSet.
Dim objTable As DataTable
Dim intRow, intColumn As Integer
' Ein DataSet kann mehr als eine Tabelle enthalten.
For Each objTable In objDataSet.Tables
With objTable
Console.Write("Daten in Tabelle " & _
.TableName & ":" & CrLf)
' Zuerst Spaltennamen auflisten.
For intColumn = 0 To .Columns.Count - 1
If intColumn = .Columns.Count - 1 Then
Console.Write(.Columns(intColumn).ColumnName _
& CrLf)
Else
Console.Write(.Columns(intColumn).ColumnName _
& ", ")
End If
Next intColumn
' Daten nach Zeilen auflisten.
For intRow = 0 To .Rows.Count - 1
' Daten nach den Feldern in den einzelnen Zeilen auflisten.
For intColumn = 0 To _
.Rows(intRow).ItemArray.Length - 1
If intColumn = _
.Rows(intRow).ItemArray.Length - 1 Then
Console.Write(.Rows(intRow). _
ItemArray(intColumn) _
& CrLf)
Else
Console.Write(.Rows(intRow). _
ItemArray(intColumn) & ", ")
End If
Next intColumn
Next intRow
End With
Next objTable
' Anhalten, damit der Benutzer die Daten im Konsolenfenster sehen kann.
Console.Write("Drücken Sie eine beliebige Taste, um fortzufahren...")
Console.Read()
End Sub
End Module
So funktioniert der Code:
-
Wiederum wird mit dem Imports-Code (z.B.
Imports System.Data.OleDb
) die Anzahl der Tastenanschläge, die für den Zugriff auf ein Objekt oder die Elemente dieses Objekts erforderlich sind, reduziert. Entsprechend werden die Objekte OleDbDataAdapter und DataSet deklariert und initialisiert, um den Adapter zwischen der Datenbank und dem DataSet bzw. auch das DataSet zu repräsentieren. Die FillData-Methode des OleDbAdapter-Objekts kopiert die Daten in der Datenbank und fügt sie in das DataSet ein. Die ListData-Unterroutine übernimmt in diesem Code den größten Teil der Arbeit.
-
Unter Verwendung der Tables-Eigenschaft des DataSet-Objekts durchläuft die äußerste For...Each-Schleife jede Tabelle im DataSet und gibt jede Tabelle als DataTable-Objekt zurück.
-
Die Columns-Eigenschaft des DataTable-Objekts gibt eine DataColumnCollection-Auflistung zurück, die alle Spalten einer Tabelle repräsentiert. Wenn die Columns-Eigenschaft zusammen mit einer Indexnummer verwendet wird (wie im Zusammenhang mit der Count-Eigenschaft der DataColumnCollection-Auflistung gezeigt), wird ein DataColumn-Objekt zurückgegeben. Die ColumnName-Eigenschaft des DataColumn-Objekts gibt den Namen der Spalte zurück.
-
Entsprechend gibt die Rows-Eigenschaft des DataTable-Objekts eine DataRowCollection-Auflistung zurück, die alle Zeilen einer Spalte repräsentiert. Wenn die Rows-Eigenschaft zusammen mit einer Indexnummer verwendet wird (wie im Zusammenhang mit der Count-Eigenschaft der DataRowCollection-Auflistung gezeigt), wird ein DataRow-Objekt zurückgegeben. Die ItemArray-Eigenschaft des DataRow-Objekts gibt ein Array vom Typ Object zurück, das die einzelnen Werte in der Datenzeile repräsentiert. Wenn die ItemArray-Eigenschaft zusammen mit einer Indexnummer verwendet wird, gibt die Eigenschaft einen individuellen Datenfeldwert zurück (so wie im Zusammenhang mit der Count-Eigenschaft der DataColumnCollection-Auflistung gezeigt).
Weitere Informationen
Weitere Informationen zu ADO.NET finden Sie in den folgenden Artikeln):
Besuchen Sie außerdem regelmäßig das Office Developer Center (in Englisch), um Informationen und technische Artikel zur Entwicklung von Office-Lösungen zu erhalten.