vb.net – nutzung von ado - luis.uni- · pdf filevb.net und datenbanken, 25.01.10 seite 4...
TRANSCRIPT
VB.NET – Nutzung von ADO.NET
VB.NET und Datenbanken, 25.01.10 Seite 2
ADO.NET
… bietet einen Zugriff auf relationale Datenbanken. … ist eine Programmierschnittstelle für den Zugriff auf Daten. … ist Bestandteil des .NET Frameworks ActiveX Data Objects.NET … im Web:
http://msdn.microsoft.com/de-de/ library/e80y5yhx.aspx
VB.NET und Datenbanken, 25.01.10 Seite 3
OleDB-Verbindung herstellen
Imports System.Data.OleDbPublic Class frmAllAdressShow Private Sub frmAllAdressShow_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim dbConnect As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\datenbank\kundenAdresse.accdb") dbConnect.Open() dbConnect.Close()
End SubEnd Class
VB.NET und Datenbanken, 25.01.10 Seite 4
Namespace importieren
Mit Hilfe von Imports wird ein Namespace (Namensraum) dem Programm bekannt gemacht.
Die Imports-Anweisung … steht immer Anfang des Programmcodes … steht außerhalb der Klassen-Definition.
Imports System.Data.OleDb
VB.NET und Datenbanken, 25.01.10 Seite 5
Namespace
… gruppieren verschiedene Bibliothekselemente. … unterteilen große Mengen von Klassen in logische Gruppen. Einzelne Namen von Klassen etc. können in verschiedenen
Gruppen vorkommen. … sind hierarchisch gegliedert. Jede Ebene der Hierarchie wird
von der nächsten Ebene durch ein Punkt getrennt.
Imports System.Data.OleDb
VB.NET und Datenbanken, 25.01.10 Seite 6
Beispiel
In diesem Beispiel wird die Gruppe System, die die Basisklassen für die Datentypen etc.
definiert. System.Data, die Klassen zum Arbeiten mit Daten
außerhalb des Projekts enthält. System.Data.OleDb bietet Klassen zum Arbeiten mit OLE-
Datenbanken. O(bject)L(inking)E(mbedding) bietet die Möglichkeit auf Datenquellen in Tabellenform zuzugreifen.
Imports System.Data.OleDb
VB.NET und Datenbanken, 25.01.10 Seite 7
Objektvariablen
Dim dbConnect As New OleDbConnection()
Dim dbConnect As New System.Data.OleDb.OleDbConnection()
Mit Hilfe des Schlüsselwortes Dim wird eine Variable definiert. Der Name der Variablen ist frei wählbar. As weist der Variablen ein Objekttyp zu. New erstellt eine Instanz von einer Klasse. Eine Instanz
beschreibt das konkrete Objekt.
VB.NET und Datenbanken, 25.01.10 Seite 8
Angabe des „Bauplans“
Dim dbConnect As New OleDbConnection()
Dim dbConnect As New System.Data.OleDb.OleDbConnection()
Jede Klasse, auf die ein Objekt beruht, ist in einem bestimmten Namensraum eindeutig definiert.
Der Namensraum kann … am Anfang des Programms mit Hilfe der Imports-
Anweisung eingebunden werden. … direkt angegeben werden.
VB.NET und Datenbanken, 25.01.10 Seite 9
Mögliche „Baupläne“ für eine Datenverbindung
SQLConnection sind spezielle Klassen für Verbindungen zu Microsoft SQL Server 7.0 und höher.
OLEDBConnection stellen Verbindungen zu allen Quellen her, die mit einem Projekt verlinkt oder in ein Projekt eingebettet werden können.
Dim connect As New System.Data.OleDb.OleDbConnection()
Dim connect As New System.Data.SqlClient.OleDbConnection()
VB.NET und Datenbanken, 25.01.10 Seite 10
Konstruktoren
Dim dbConnect As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=..\kundenAdresse.accdb")
… sind Prozeduren zum Initialisieren von Instanzen. … stellen für einen Bauplan die Randbedingungen zur
Verfügung. … werden mit Hilfe des Schlüsselwortes New aufgerufen. … bekommen eine Liste von Parametern in runden Klammern
übergeben. In diesem Beispiel wird eine Verbindungszeichenfolge übergeben.
VB.NET und Datenbanken, 25.01.10 Seite 11
Verbindungszeichenfolge
Dim dbConnect As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=..\kundenAdresse.accdb")
… wird durch Anführungszeichen begrenzt. … besteht aus verschiedenen Attributen. Die Anzahl und Art der Attribute ist von dem gewählten
Verbindungstyp abhängig. Mit Hilfe des Gleichheitszeichen werden den Attributen in der
Zeichenfolge Werte zugewiesen.
VB.NET und Datenbanken, 25.01.10 Seite 12
OLEDB-Verbindungszeichenfolge
Dim dbConnect As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=..\kundenAdresse.accdb")
Dem Attribut Data Source wird der Speicherort der Datenbank übergeben. Die Datenquelle kann eine beliebige Struktur sowie Speicherort besitzen.
Provider legt die Art der Datenquelle sowie deren Verbindung fest.
In diesem Beispiel wird eine Verbindung zu einer Access-Datenbank aufgebaut.
VB.NET und Datenbanken, 25.01.10 Seite 13
Provider für relationale Datenbanken
Microsoft.ACE.OLEDB.12.0 kann zum Beispiel eine Verbindung zu einer Access 2007-Datenbank aufbauen.
Microsoft.Jet.OLEDB.4.0 kann zum Beispiel eine Verbindung zu einer Access 2003-Datenbank aufbauen.
Weitere Provider finden Sie unter http://www.carlprothman.net/Default.aspx?tabid=81
VB.NET und Datenbanken, 25.01.10 Seite 14
Passwort und Benutzername
… können in den Attributen Password und User ID gespeichert werden.
… sollten aber nie fest in ein Connection-String geschrieben werden.
… sollten über ein Dialogfeld abgefragt werden. … für eine Datenbank entsprechen häufig der Windows-
Identifikation am Rechner.
VB.NET und Datenbanken, 25.01.10 Seite 15
Verbindung öffnen und schließen
dbConnect.Open()dbConnect.Close()
Mit Hilfe der Methode .Open() wird eine Verbindung geöffnet. Eine geöffnete Verbindung kann nicht erneut geöffnet werden!
Mit Hilfe der Methode .Close() wird eine offene Verbindung geschlossen.
Die Eigenschaft .State hat folgende Attributwerte: ConnectionState.Open. Die Datenbank ist geöffnet. ConnectionState.Closed. Die Datenbank ist geschlossen.
VB.NET und Datenbanken, 25.01.10 Seite 16
Fehler (Bugs)
Syntaxfehler entstehen beim Schreiben des Programmcodes. Logische Fehler treten auf, wenn der Entwickler ein Denkfehler
bei der Umsetzung der Aufgabe in ein Programm macht. Das Programm wird fehlerfrei ausgeführt, aber das Ergebnis ist nicht korrekt.
Laufzeitfehler treten während der Ausführung des Programms auf. Zum Beispiel eine CD, von der Daten gelesen werden sollen, befindet sich nicht im Laufwerk.
VB.NET und Datenbanken, 25.01.10 Seite 17
Syntaxfehler
Die Syntax einer Programmiersprache ist die Gesamtheit der Regeln für die Bildung von Anweisungen aus Operatoren und Operanden sowie die Nutzung von Funktionen.
... verhindern die Kompilierung eines Programms. ... sind zum Beispiel:
Tippfehler bei der Eingabe von Variablennamen oder Schlüsselwörtern.
Mischung von numerischen und nicht-numerischen Operatoren.
Falsche Parameterübergabe an Funktionen. Syntaxfehler in Schleifen oder bedingten Anweisungen.
VB.NET und Datenbanken, 25.01.10 Seite 18
… anzeigen
Im Codefenster werden Syntaxfehler durch eine farbige Schlange angezeigt.
Durch Überfahren des Fehlers mit der Maus wird … ein ToolTip, welches eine Fehlerbeschreibung anzeigt,
sowie … ein Ausrufezeichen im roten Kreuz, welches Hilfen zur
Fehlerkorrektor anbietet, eingeblendet.
VB.NET und Datenbanken, 25.01.10 Seite 19
Fehlerliste
Ansicht – Fehlerliste blendet ein zusätzliches Fenster ein. Pro Zeile wird ein Fehler angezeigt. Die Zeile zeigt spaltenweise folgende Informationen an:
Was für ein Fehler ist aufgetreten? In welcher Datei? In welcher Zeile?
VB.NET und Datenbanken, 25.01.10 Seite 20
… vermeiden
Öffnen Sie das Menü Extras – Optionen. Aktivieren Sie das Kontrollkästchen Alle Einstellungen anzeigen. Öffnen Sie den Ordner Projekte und Projektmappen und den
Unterordner VB-Standard. Stellen Sie für die Elemente Option Explicit und Option Strict den Wert On ein. Option Explicit erzwingt eine Variablendeklaration. Option Strict verhindert eine Datentyp-Konvertierung mit
Datenverlusten. Wechseln Sie in den Ordner Text-Editor – Basic –VB -
spezifisch. Aktivieren Sie das Kästchen Vorschläge für Fehlerkorrektur aktivieren.
VB.NET und Datenbanken, 25.01.10 Seite 21
Laufzeitfehler
... sind Bugs, die nach dem Start eines Programms auftreten können.
... betreffen immer die Programmlogik. ... können Programme zu einem unerwünschten Verhalten oder
einen Programmabsturz zwingen. ... entstehen, wenn Ausdrücke oder Anweisungen von dem
Programm nicht korrekt ausgewertet werden. Beispiele:
Division durch Null. Überlauf (zu großer oder zu kleiner Wert für den
angegebenen Datentyp). Ein- und Ausgabefehler.
VB.NET und Datenbanken, 25.01.10 Seite 22
Laufzeitfehler abfangen
Imports System.Data.OleDb... Dim dbConnect As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=..\kundenAdresse.accdb")
Try dbConnect.Open()Catch ex As Exception MessageBox.Show(ex.Message, "Fehler")Finally dbConnect.Close()End Try
VB.NET und Datenbanken, 25.01.10 Seite 23
Arbeitsablauf: Keine Fehler vorhanden
Es werden alle Anweisungen, die dem Schlüsselwort Try folgen ausgeführt.
Wenn kein Fehler auftritt, wird in diesem Beispiel die Verbindung zur Datenquelle geöffnet.
Try dbConnect.Open()End Try
VB.NET und Datenbanken, 25.01.10 Seite 24
Arbeitsablauf: Fehler vorhanden
Falls ein Fehler aufgetreten ist, wird eine Exception (Ausnahme) ausgelöst.
Die Exception wird mit Hilfe des Schlüsselwortes Catch abgefangen.
Try dbConnect.Open()Catch ex As Exception MessageBox.Show(ex.Message, "Fehler")End Try
VB.NET und Datenbanken, 25.01.10 Seite 25
Welcher Fehler wird abgefangen?
Dem Schlüsselwort Catch folgt eine Definition einer Variablen vom Typ Exception (Ausname)
Diese Variable hat die Eigenschaft Message, die den Fehlertext enthält.
Mit Hilfe von MessageBox.Show kann dieser Fehlertext in einem Dialogfenster angezeigt werden.
Try dbConnect.Open()Catch ex As Exception MessageBox.Show(ex.Message, "Fehler")End Try
VB.NET und Datenbanken, 25.01.10 Seite 26
Arbeitsablauf: Aufräumen
Alle Anweisungen, die dem Schlüsselwort Finally folgen, werden immer ausgeführt. Das heißt, die Verbindung wird in diesem Beispiel auch geschlossen, wenn ein Fehler aufgetreten ist.
Try dbConnect.Open()Catch ex As Exception MessageBox.Show(ex.Message, "Fehler")Finally dbConnect.Close()End Try
VB.NET und Datenbanken, 25.01.10 Seite 27
SQL-Anweisungen im Code
Dim sqlText As String = ""Dim dbConnect As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\datenbank\kundenAdresse.accdb")Dim dbCommand As OleDbCommandDim dbReader As OleDbDataReader
sqlText = "SELECT Firma, Anrede, Ansprechpartner, Strasse, PLZ, Ort FROM tblKunde;"Try dbConnect.Open() dbCommand = New OleDbCommand(sqlText, dbConnect)End Try
VB.NET und Datenbanken, 25.01.10 Seite 28
Arbeitsablauf
Zuerst wird eine Verbindung zu einer Datenbank erstellt. Es wird eine Variable vom Typ OleDBConnection oder
SqlConnection benötigt. Mit Hilfe der Methode Open wird die Verbindung geöffnet.
An diese geöffnete Verbindung wird eine SQL-Anweisung gesendet. Es wird ein Command-Objekt deklariert. Diesem Objekt wird eine SQL-Anweisung und die Art der
Verbindung übergeben.
VB.NET und Datenbanken, 25.01.10 Seite 29
Command-Objekt
… wird benötigt, um Daten aus einer Datenbank auszulesen oder zu verändern.
… stellt eine SQL-Anweisung dar. … benötigt eine offene Verbindung zu einer Datenbank. Jede
offene Verbindung kann zu einer bestimmten Zeit nur genau ein Command-Objekt verarbeiten.
VB.NET und Datenbanken, 25.01.10 Seite 30
Arbeitsablauf
Das Command-Objekt wird deklariert. Im nächsten Schritt wird das Command-Objekt mit einer Sql-
Anweisung initialisiert. Die Anweisung wird mit Hilfe der angegebenen, geöffneten
Verbindung ausgeführt. Das Command-Objekt kann ein Ergebnis zurückliefern. Über die Verbindung wird das Ergebnis der SQL-Anweisung
zurückgeliefert. Dieses Ergebnis kann als Datenquelle in einem Projekt genutzt werden.
VB.NET und Datenbanken, 25.01.10 Seite 31
Variable für ein Command-Objekt deklarieren
Eine Variable vom Typ des Command-Objekts wird deklariert. Die Variable wird mit Nothing (Nichts) initialisiert. Sie verweist
auf kein Objekt.
Dim dbCommand As OleDbCommand = Nothing
VB.NET und Datenbanken, 25.01.10 Seite 32
Command-Objekt initialisieren
Ein Objekt wird mit New erstellt. In diesem Beispiel wird ein Objekt OleDbCommand neu erstellt. In runden Klammern wird dem Objekt als Startwert
… die auszuführende SQL-Anweisung sowie … die Verbindung zu der Datenbank übergeben.
Dim dbCommand As OleDbCommand = Nothing
sqlText = "SELECT Firma, Anrede, Ansprechpartner, Strasse, PLZ, Ort FROM tblKunde;"dbCommand = New OleDbCommand(sqlText, dbConnect)
VB.NET und Datenbanken, 25.01.10 Seite 33
Geänderte Datensätze in einem DataSet
Dim dataRow As DataRowDim dataTable As DataTabledataTable = Me.KundenAdresseDataSet.Tables("tblKunde").GetChanges
For Each dataRow In dataTable.Rows sqlText = "UPDATE tblKunde SET" … sqlText = sqlText & ", PLZ = '" & dataRow.Item(5).ToString & "'" sqlText = sqlText & " WHERE IDKunde = " & dataRow.Item(0).ToStringNext dataRow
VB.NET und Datenbanken, 25.01.10 Seite 34
Auflistung der geänderten Datensätze
Me beschreibt die Form, an der der Code hängt. Diese Form kann auf ein DataSet zugreifen. Jedes DateSet eine Auflistung von Tabellen (Tables).
Auflistungen enden immer mit einem „s“. Jede Tabelle hat eine Auflistung der geänderten Datensätze
(GetChanges).
Dim dataTable As DataTable
dataTable = Me.KundenAdresseDataSet.Tables("tblKunde").GetChanges
VB.NET und Datenbanken, 25.01.10 Seite 35
Auflistung (Collection)
... ist ein Behältniss für eine Sammlung von Objekten mit bestimmten Eigenschaften.
... ist ein dynamisches Felder von einer bestimmten Objektart. ... ist eine Liste aller Elemente einer Objektart. Die Bezeichnung einer Auflistung endet immer mit s. ... hat genauso wie Objekte Eigenschaften und Methoden. Zum
Beispiel die Eigenschaft Count gibt die Anzahl der Elemente in einer Auflistung zurück.
VB.NET und Datenbanken, 25.01.10 Seite 36
Zellen in einer Zeile
Jede Datentabelle hat eine Auflistung der Zeilen / Datensätze (Rows).
Jede Zeile hat Elemente (Item), die die Zellen bezeichnen. Eine Zelle wird mit Hilfe eines Indizes bestimmt. Die erste Zelle
hat den Index 0. In diesem Beispiel wird der Inhalt der sechsten Zelle in der
angegebenen Zeile in ein String konvertiert.
For Each dataRow In dataTable.Rows … sqlText = sqlText & ", PLZ = '" & dataRow.Item(5).ToString & "'"Next dataRow
VB.NET und Datenbanken, 25.01.10 Seite 37
Index von Feldern (Arrays)
... sind nullbasiert. Das erste Element in der Auflistung hat den Index null. Der Index der Elemente einer Auflistung verändert sich in
Abhängigkeit der Anzahl der Elemente. Der Index ist nicht an ein bestimmtes Element gekoppelt.
VB.NET und Datenbanken, 25.01.10 Seite 38
Zellen in einer Zeile
Eine Auflistung kann mit Hilfe der For Each-Schleife durchlaufen werden.
Dem Schlüsselwort For Each folgt eine Variable, die ein Element in der Auflistung symbolisiert.
Dem Schlüsselwort In folgt der Name der Auflistung. In diesem Beispiel werden die Zeilen einer Tabelle durchlaufen.
Next springt zu dem nächsten Element. In diesem Beispiel die nächste Zeile in der Auflistung.
For Each dataRow In dataTable.Rows …Next dataRow
VB.NET und Datenbanken, 25.01.10 Seite 39
Datensätze in der Datenbank ändern
Dim sqlText As String = "UPDATE ..."Dim dbConnect As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\datenbank\kundenAdresse.accdb")Dim dbCommand As New OleDbCommand
dbConnect.Open()dbCommand.Connection = dbConnectdbCommand.CommandText = sqlTextdbCommand.ExecuteNonQuery()
dbConnect.Close()
VB.NET und Datenbanken, 25.01.10 Seite 40
SQL-Anweisung UPDATE
Die Aktualisierungsabfrage wird mit UPDATE eingeleitet. Im Anschluss daran wird die Tabelle aufgeführt, deren Daten
geändert werden sollen. Es können immer nur die Daten in einer Tabelle geändert werden.
Dem Befehl SET folgt die Berechnung der neuen Daten. Die Anzahl der zu ändernden Datensätze kann mit WHERE
eingeschränkt werden.
sqlText = "UPDATE tblKunde SET" …sqlText = sqlText & ", PLZ = '" & dataRow.Item(5).ToString & "'"sqlText = sqlText & " WHERE IDKunde = " & dataRow.Item(0).ToString
VB.NET und Datenbanken, 25.01.10 Seite 41
Eigenschaften des Command-Objekts
Die Eigenschaft Connection beschreibt immer die Verbindung zu der Datenbank eines Command-Objekts.
CommandText enthält die auszuführende SQL-Anweisung.
dbCommand.Connection = dbConnectdbCommand.CommandText = sqlText
VB.NET und Datenbanken, 25.01.10 Seite 42
SQL-Anweisung ausführen
Die Methode ,ExecuteNonQuery() gibt keine Daten zurück. Es wird nur eine SQL-Anweisung zur Datenbank gefeuert. Als Rückgabewert werden die Anzahl der geänderten
Datensätze zurückgeliefert. Der Rückgabewert muss nicht ausgewertet werden.
… wird häufig für UPDATE, INSERT oder DELETE genutzt.
dbCommand.ExecuteNonQuery()
VB.NET und Datenbanken, 25.01.10 Seite 43
Neue Datensätze in der Datenbank einfügen
Dim sqlText As String = ""Dim dbConnect As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\datenbank\kundenAdresse.accdb")Dim dbCommand As OleDbCommand
sqlText = "INSERT INTO tblKunde (Firma)"sqlText = sqlText & " VALUES ("sqlText = sqlText & "'" & txtFirma.Text & ")"dbConnect.Open()dbCommand = New OleDbCommand(sqlText, dbConnect)dbCommand.ExecuteNonQuery()
VB.NET und Datenbanken, 25.01.10 Seite 44
SQL-Anweisung INSERT INTO
INSERT INTO autor ( vorname, nachname )SELECT newautor.vorname, newautor.nachname FROM newautor
sqlText = "INSERT INTO tblKunde (Firma)"sqlText = sqlText & " VALUES ("sqlText = sqlText & "'" & txtFirma.Text & ")"
VB.NET und Datenbanken, 25.01.10 Seite 45
Wo werden die Daten eingefügt?
Eine Anfüge-Abfrage beginnt mit INSERT INTO. Dem SQL-Befehl folgt ein Tabellenname. In diese Tabelle
werden die Daten eingefügt. In den runden Klammern folgt der Tabelle eine Liste von
Feldern. In diese Felder werden die Daten von links beginnend eingefügt.
INSERT INTO autor ( vorname, nachname ) ...
VB.NET und Datenbanken, 25.01.10 Seite 46
Welche Daten werden eingefügt?
Die anzufügenden Daten werden mit Hilfe … einer SELECT-Anweisung ausgewählt. … einer Wertliste (VALUES) bestimmt.
Die neuen Werte werden den Feldern in der Zieltabelle immer von links nach rechts zugeordnet.
INSERT INTO autor ( vorname, nachname ) SELECT newautor.vorname, newautor.nachname FROM newautorINSERT INTO autor ( vorname, nachname ) VALUES ("Tim", "Regen")
VB.NET und Datenbanken, 25.01.10 Seite 47
Selektierte Datensätze in einem DataGridView...
Dim selectedRow As DataGridViewRowDim lstIDKunde As StringlstIDKunde = ""
For Each selectedRow In Me.ShowKundeAdresse.SelectedRows If lstIDKunde <> "" Then lstIDKunde = lstIDKunde & ", " End If
lstIDKunde = selectedRow.Cells.Item(0).Value.ToString Me.ShowKundeAdresse.Rows.Remove(selectedRow)Next selectedRow
VB.NET und Datenbanken, 25.01.10 Seite 48
Selektierte Datensätze
… werden in der Auflistung SelectedRows gesammelt. … sind vom Datentyp DataGridViewRow und nicht DataRow.
Dim selectedRow As DataGridViewRowFor Each selectedRow In Me.ShowKundeAdresse.SelectedRows
VB.NET und Datenbanken, 25.01.10 Seite 49
Werte einer Zelle in einer selektierten Zeile
Die Auflistung Cells enthält alle Zellen einer Zeile. Item(0) verweist auf die erste Zelle in der angegebenen Zeile.
Innerhalb der runden Klammern wird ein Index angegeben. Der Index beginnt mit 0.
Die Eigenschaft Value enthält den Wert der Zelle.
lstIDKunde = selectedRow.Cells.Item(0).Value.ToString
VB.NET und Datenbanken, 25.01.10 Seite 50
Selektierte Datensätze löschen
Die Methode .Remove() wird ein Verweis auf eine bestimmte Zeile in runden Klammern übergeben.
In diesem Beispiel wird die ausgewählte Zeile übergeben und anschließend gelöscht.
Me.ShowKundeAdresse.Rows.Remove(selectedRow)
VB.NET und Datenbanken, 25.01.10 Seite 51
Datensätze in einer Datenbank löschen
Dim sqlText As String = ""Dim dbConnect As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\datenbank\kundenAdresse.accdb")Dim dbCommand As OleDbCommand
sqlText = "DELETE FROM tblKunde “sqlText = sqlText & “WHERE IDKUNDE IN(" & lstIDKunde & ")"
dbConnect.Open()dbCommand = New OleDbCommand(sqlText, dbConnect)dbCommand.ExecuteNonQuery()
VB.NET und Datenbanken, 25.01.10 Seite 52
SQL-Anweisung DELETE
Das Schlüsselwort DELETE leitet eine Löschabfrage ein. Eine Löschabfrage wird immer über eine Tabelle gestellt. FROM tblKunde gibt Auskunft darüber, in welcher Tabelle die
Datensätze gelöscht werden sollen. Mit Hilfe von WHERE wird eine Bedingung zur Auswahl der
Datensätze angegeben. Die Anzahl der zu löschenden Datensätze wird eingeschränkt.
sqlText = "DELETE FROM tblKunde “sqlText = sqlText & “WHERE IDKUNDE IN(" & lstIDKunde & ")"
VB.NET und Datenbanken, 25.01.10 Seite 53
Cursor auf die Daten erzeugen
Dim sqlText As String = ""Dim dbConnect As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\datenbank\kundenAdresse.accdb")Dim dbCommand As OleDbCommandDim dbReader As OleDbDataReader
sqlText = "SELECT Firma, Anrede, Ansprechpartner, Strasse, PLZ, Ort FROM tblKunde;"Try dbConnect.Open() dbCommand = New OleDbCommand(sqlText, dbConnect) dbReader = dbCommand.ExecuteReader() End Try
VB.NET und Datenbanken, 25.01.10 Seite 54
Erläuterung
Eine Variable vom Typ des DataReaders-Objekts wird deklariert.
Der DataReader wird über die Methode .ExecuteReader() erzeugt. Der DataReader ist ein Cursor auf die zu lesenden Daten. Die zu lesende Daten sind mit Hilfe des Command-Objekts
festgelegt.
Dim dbReader As OleDbDataReader
dbReader = dbCommand.ExecuteReader()
VB.NET und Datenbanken, 25.01.10 Seite 55
DataReader
… ist ein Cursor auf Daten in einer Datenquelle. … kann nur lesend auf die Daten zugreifen. … ist ein vorwärtsgerichteter Cursor. … kann nur Seite für Seite umblättern, aber nicht
zurückblättern. … benötigt eine geöffnete Verbindung.
VB.NET und Datenbanken, 25.01.10 Seite 56
Grafische Darstellung
Datenquelle
Connection
Command
DataReader
VB.NET und Datenbanken, 25.01.10 Seite 57
Arbeitsablauf
Eine Verbindung wird geöffnet. Ein Command-Objekt wird erzeugt. Das Command wird mit Hilfe der ExecuteReader-Methode
ausgeführt. Ein DataReader wird durch die Methode erzeugt. Das Ergebnis wird in einer temporären Tabelle in einer
Datenbank gespeichert. Der DataReader setzt ein Lese-Cursor vor den ersten
Datensatz. Es werden die Spalteninhalte bereitgestellt. Das VB-Programm liest die Daten und speichert diese in einem
lokalen Speicher oder verarbeitet die Daten direkt.
VB.NET und Datenbanken, 25.01.10 Seite 58
Daten aus der Datenquelle lesen
Try dbReader = dbCommand.ExecuteReader() Do While dbReader.Read() If strAusgabe = "" Then strAusgabe = dbReader("Firma").ToString Else strAusgabe = strAusgabe & ControlChars.NewLine & dbReader.GetString(0) End If LoopEnd Try
VB.NET und Datenbanken, 25.01.10 Seite 59
Erläuterung
Mit Hilfe der Methode .Read() … liest der Cursor jeweils ein Datensatz (eine Zeile) ein. … wird der Cursor auf den nächsten Datensatz gesetzt.
Wenn das Ende (EOF) der Tabelle erreicht ist, wird der Wert False zurückgeliefert.
Dim dbReader As OleDbDataReaderdbReader = dbCommand.ExecuteReader() Do While dbReader.Read() ...Loop
VB.NET und Datenbanken, 25.01.10 Seite 60
Anweisungen wiederholen
Do While – Loop ist eine Schleife. Die Schleife wiederholt die Anweisungen zwischen Do While und
Loop beliebig oft. Die Schleife wird in Abhängigkeit einer Bedingung durchlaufen.
Die Bedingung folgt dem Schlüsselwort Do While. Eine Do While - Loop-Schleife läuft solange wie die Bedingung
erfüllt ist. Sobald die Bedingung nicht erfüllt ist, wird die Schleife abgebrochen.
Do While dbReader.Read() ...Loop
VB.NET und Datenbanken, 25.01.10 Seite 61
Untypisierte Daten aus den Spalten lesen
dbReader("Firma").ToString … liest die Daten aus der Spalte „Firma“. … haben keinen definierten Datentyp. NULL-Werte des Feldes verursachen keinen Fehler.
Die Daten werden mit Hilfe der Methode .ToString in eine Zeichenkette umgewandelt werden.
strAusgabe = dbReader("Firma").ToString
VB.NET und Datenbanken, 25.01.10 Seite 62
Weitere Möglichkeit
dbReader.Item(0) oder dbReader.Item("Firma") liest eine Spalte ohne Konvertierung aus der Quelle aus. Der Spalteninhalt hat den gleichen Datentyp für die Quelle sowie auch im Programm. NULL-Werte der Felder werden ausgelesen.
In diesem Beispiel wird der Inhalt anschließend in einem String konvertiert.
Die Spalte wird mit Hilfe eines Indizies bestimmt. Als Index kann eine Ganzzahl oder der Feldname der Spalte genutzt werden.
strAusgabe = dbReader("Firma").ToString
strAusgabe = dbReader.Item("Firma").ToString
VB.NET und Datenbanken, 25.01.10 Seite 63
Ganzzahl oder Spaltenname als Index?
Der Zugriff mit Hilfe einer Ganzzahl ist schneller. Aber: Die Ganzzahl ist nicht an eine Spalte gebunden. Zum
Beispiel bezeichnet die Ganzzahl 2 die Spalte „Strasse“. Vor dieser Spalte wird eine neue Spalte „Unternehmensform“ eingefügt. Die Ganzzahl 2 bezeichnet jetzt die Spalte „Unternehmensform“ und nicht mehr die Spalte „Strasse“.
Spaltennamen sind für den Programmierer besser lesbar.
VB.NET und Datenbanken, 25.01.10 Seite 64
Typisierte Daten aus den Spalten lesen
dbReader.GetString(0) … liest eine Spalte vom Datentyp „String“ aus. Null-Werte erzeugen einen Fehler. Get...() gibt es für jeden Datentyp einer Datenbank. Die zu lesende Spalte wird mit Hilfe ihres Indizes
angesprochen. Die erste Spalte hat den Index 0. Mit Hilfe der Methode .GetOrdinal("Firma") kann der Index einer Spalte ermittelt werden.
strAusgabe = dbReader("Firma").ToString
strAusgabe = dbReader.Item("Firma").ToString
strAusgabe = strAusgabe & ControlChars.NewLine & dbReader.GetString(0)
VB.NET und Datenbanken, 25.01.10 Seite 65
Texte verknüpfen
Mit Hilfe des kaufmännischen Unds werden verschiedene Texte aneinandergereiht.
ControlChars definiert Sonderzeichen wie eine neue Zeile (ControlChars.NewLine), Tabulator etc.
strAusgabe = dbReader("Firma").ToString
strAusgabe = strAusgabe & ControlChars.NewLine & dbReader.GetString(0)
VB.NET und Datenbanken, 25.01.10 Seite 66
Sind Datensätze vorhanden?
Try ... dbReader = dbCommand.ExecuteReader()
If dbReader.HasRows Then Do While dbReader.Read() ... LoopEnd Try
Mit Hilfe der Methode .HasRows kann abgefragt werden, ob Datensätze vorhanden sind oder nicht.
VB.NET und Datenbanken, 25.01.10 Seite 67
DataReader schließen
Der Cursor wird nach dem Lesen aller Datensätze geschlossen.
Eine geöffneter DataReader blockiert die Verbindung. Die genutzte Verbindung kann nicht von anderen Command-Objekten verwendet werden.
dbReader.Close()
VB.NET und Datenbanken, 25.01.10 Seite 68
DataAdapter
… füllt immer Tabellen in Abhängigkeit einer SELECT-Anweisung.
… sollte für jede benötigte Tabelle angelegt werden, muss aber nicht.
Daten werden von einer Datenbank in eine Tabelle geladen. Datenänderungen werden zurücgespeichert.
VB.NET und Datenbanken, 25.01.10 Seite 69
Grafische DarstellungLokale Datenspeicher
Dataset
Tabelle 1 Tabelle 2 Tabelle 1
Datenbank
Datenadapter
VB.NET und Datenbanken, 25.01.10 Seite 70
Voraussetzung für die Nutzung
Eine Verbindung (Connection-Objekt) existiert. Die Verbindung muss aber nicht geöffnet sein.
Ein DataSet-Objekt oder ein DataTable-Objekt ist vorhanden. Eine SQL-Anweisung muss erstellt werden. Ein DataAdapter muss erzeugt werden.
VB.NET und Datenbanken, 25.01.10 Seite 71
Daten lesen
Eine geschlossene Verbindung zu einer Datenquelle wird automatisch vom DataAdapter geöffnet.
Anschließend wird die SELECT-Anweisung vom DataAdapter ausgeführt.
Die Ergebnismenge der Anweisung wird erzeugt. Der DataAdapter nutzt ein DataReader-Objekt, um die
Ergebnismenge auszulesen. Der DataAdapter schreibt die gelesenen Daten in das DataSet
oder DataTable.
VB.NET und Datenbanken, 25.01.10 Seite 72
DataAdapter erzeugen
Dim daKunde As OleDbDataAdapter
sqlText = "SELECT * FROM tblKunde"
dbConnect.Open()daKunde = New OleDbDataAdapter(sqlText, dbConnect)
Dem Konstruktor wird … eine SQL-Anweisung zur Auswahl der Daten übergeben. … eine offene Verbindung übergeben.
VB.NET und Datenbanken, 25.01.10 Seite 73
UpdateCommand
sqlText = "UPDATE tblKunde SET Firma = ?, Anrede = ?, Ansprechpartner = ?, "sqlText = sqlText & "Straße = ?, PLZ = ?, Ort = ? WHERE IDKunde = ?"
dataAdapter.UpdateCommand = New OleDbCommand(sqlText, dbConnect)
… speichert Änderungen in der Datenquelle. Die Fragezeichen in der UPDATE-Anweisung werden durch die
entsprechenden Parameter ersetzt.
VB.NET und Datenbanken, 25.01.10 Seite 74
Parameter zum UpdateCommand
Dim parameter As OleDbParameterWith dataAdapter.UpdateCommand.Parameters .Add("Firma", OleDbType.VarChar, 255, "Firma") .Add("Anrede", OleDbType.VarChar, 10, "Anrede") .Add("Ansprechpartner", OleDbType.VarChar, 255, "Ansprechpartner") .Add("Straße", OleDbType.VarChar, 255, "Straße") .Add("PLZ", OleDbType.VarChar, 5, "PLZ") .Add("Ort", OleDbType.VarChar, 255, "Ort")
parameter = New OleDbParameter("IDKundeOld", OleDbType.UnsignedBigInt, 30000, "IDKunde") parameter.SourceVersion = DataRowVersion.Original .Add(parameter)End With
VB.NET und Datenbanken, 25.01.10 Seite 75
Erläuterung: Add-Methode
In der Auflistung Parameters werden alle Parameter der Sql-Anweisung gesammelt.
Mit Hilfe der Methode .Add() werden Parameter angefügt, die die aktuell, geänderten Werte der entsprechenden Spalten symbolisieren.
Der Methode .Add() wird der Name des Parameters, der Datentyp, die Größe und der Name der dazugehörigen Spalte übergeben.
VB.NET und Datenbanken, 25.01.10 Seite 76
Erläuterung: Primärschlüssel
parameter = New OleDbParameter("IDKundeOld", OleDbType.UnsignedBigInt, 30000, "IDKunde")
Parameter, die den Primärschlüssel betreffen, werden mit Hilfe des Konstuktors des Objekts OleDbParameter erzeugt und anschließend der Auflistung hinzugefügt.
Der Parameter wird benötigt, um einen Datensatz eindeutig zu identifizieren.
Dem Konstruktor werden der Name des Parameters, der Datentyp, die Größe und der Name der dazugehörigen Spalte übergeben. Der Parameter und der Feldname müssen unterschiedliche Bezeichnungen haben.
VB.NET und Datenbanken, 25.01.10 Seite 77
Erläuterung: Primärschlüssel
parameter = New OleDbParameter("IDKundeOld", OleDbType.UnsignedBigInt, 30000, "IDKunde")
parameter.SourceVersion = DataRowVersion.Original
Die Eigenschaft SourceVersion gibt Auskunft darüber, ob die aktuelle Zeile oder eine andere mit Hilfe der Anweisung aktualisiert wird.
Standardmäßig wird immer die aktuelle Zeile aktualisiert. Mit Hilfe von DataRowVersion.Original wird die Zeile aus der
Originalquelle aktualisiert.
VB.NET und Datenbanken, 25.01.10 Seite 78
InsertCommand
sqlText = "INSERT INTO tblKunde (Firma, Anrede, Ansprechpartner, "sqlText = sqlText & "Straße, PLZ, Ort) VALUES(?, ?, ?, ?, ?, ?)"dataAdapter.InsertCommand = New OleDbCommand(sqlText, dbConnect)
With dataAdapter.InsertCommand.Parameters .Add("Firma", OleDbType.VarChar, 255, "Firma") .Add("Anrede", OleDbType.VarChar, 10, "Anrede") .Add("Ansprechpartner", OleDbType.VarChar, 255, "Ansprechpartner") .Add("Straße", OleDbType.VarChar, 255, "Straße") .Add("PLZ", OleDbType.VarChar, 5, "PLZ") .Add("Ort", OleDbType.VarChar, 255, "Ort")End With
VB.NET und Datenbanken, 25.01.10 Seite 79
DeleteCommand
sqlText = "DELETE FROM tblKunde WHERE IDKunde = ?"dataAdapter.DeleteCommand = New OleDbCommand(sqlText, dbConnect)
parameter = New OleDbParameter("IDKundeOld", OleDbType.UnsignedBigInt, 30000, "IDKunde")parameter.SourceVersion = DataRowVersion.OriginaldataAdapter.DeleteCommand.Parameters.Add(parameter)
VB.NET und Datenbanken, 25.01.10 Seite 80
DataTable löschen und füllen
Private dataTable As New DataTable()dataTable.Clear()dataAdapter.Fill(dataTable)
listKunde.DataSource = dataTable
Mit Hilfe der Methode .Clear() wird der Inhalt der Datentabelle gelöscht.
Die Methode .Fill() lädt die Daten aus der Datenbank in die angegebene Tabelle (dataTable). Die Methode löscht nicht den Inhalt der Tabelle!
Diese Tabelle kann wiederum als Datenquelle für ein DataGridView dienen.
VB.NET und Datenbanken, 25.01.10 Seite 81
Änderungen zurückschreiben
Try dataAdapter.Update(dataTable) MsgBox("Die Daten wurden in der Datenquelle gespeicher!")Catch ex As Exception MessageBox.Show(ex.Message, "Fehler")End Try
Die Methode .Update() aktualisiert die Daten aus der Datenquelle mit den Daten aus der, in den runden Klammern angegebenen, Tabelle.
Für jeden geänderten Datensatz werden die entsprechenden SQL-Anweisungen ausgeführt. Wenn zum Beispiel ein Datensatz gelöscht wurde, wird DeleteCommand ausgeführt.
VB.NET und Datenbanken, 25.01.10 Seite 82
Gültigkeitsprüfung für den Primärschlüssel
dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
In diesem Beispiel werden Einschränkungen („NULL ist erlaubt“, „Maximale Länge“) für den Primärschlüssel aus der Datenquelle übernommen.
Nicht existierende Spalten werden zu einer DataTable hinzugefügt.
Andere Einstellungen für die Überprüfung sind möglich.
VB.NET und Datenbanken, 25.01.10 Seite 83
DataTable
… entspricht einer Tabelle im lokalen Datenspeicher. … besteht aus Zeilen (Row) und Spalten (Column). … speichert die Daten in Form einer Auflistung von Zeilen. Jede Zeile in einer Tabelle sollte durch ein Schlüsselfeld
eindeutig gekennzeichnet sein.
VB.NET und Datenbanken, 25.01.10 Seite 84
Neue Spalten erzeugen
Public Sub newTable() Dim dsKunde As DataSet = New DataSet
tblKunde = dsKunde.Tables.Add("tblKunde")
tblKunde.Columns.Add("IDKunde", System.Type.GetType("System.Int32")) tblKunde.Columns.Add("Anrede", System.Type.GetType("System.String")) tblKunde.Columns.Add("Kunde", System.Type.GetType("System.String")) tblKunde.Columns.Add("Strasse", System.Type.GetType("System.String")) tblKunde.Columns.Add("PLZ", System.Type.GetType("System.String")) tblKunde.Columns.Add("Ort", System.Type.GetType("System.String"))
End Sub
VB.NET und Datenbanken, 25.01.10 Seite 85
Erläuterung
Mit Hilfe der Methode .Add() werden der Auflistung Columns neue Spalten hinzugefügt.
Folgende Parameter werden der Methode übergeben: Die Bezeichnung der Spalte. Der Name sollte immer den
Inhalt der Spalte widerspiegeln. Der Datentyp der Spalte wird mit Hilfe der Methode .GetType()
festgelegt. Die Methode ist im Namensraum System.Type definiert.
VB.NET und Datenbanken, 25.01.10 Seite 86
Index einer Spalte
Dim key As IntegerDim zeile As DataRowDim indexKey As Integer
indexKey = tblKunde.Columns.IndexOf("IDKunde")
key = CInt(tblKunde.Rows(posKunde).Item(indexKey).ToString)
VB.NET und Datenbanken, 25.01.10 Seite 87
Erläuterung
Der Index einer Spalte kann sich durch Löschen oder Verschieben von Spalten verändern. Der Index ist nicht an eine bestimmte Spalte gebunden.
Mit Hilfe der Methode .IndexOf() der Auflistung Columns wird der Spaltenindex einer Spalte mit Hilfe der Bezeichnung ermittelt.
In diesem Beispiel wird der momentane Index der Spalte „IDKunde“ ermittelt.
VB.NET und Datenbanken, 25.01.10 Seite 88
Inhalt einer Spalte einer Zeile
Dim key As IntegerDim zeile As DataRowDim indexKey As Integer
indexKey = tblKunde.Columns.IndexOf("IDKunde")
key = CInt(tblKunde.Rows(posKunde).Item(indexKey).ToString)
VB.NET und Datenbanken, 25.01.10 Seite 89
Erläuterung
Die Eigenschaft Item der Auflistung Rows liefert den Inhalt einer Zelle zurück.
Die Position einer Zelle wird durch die Zeilen- sowie Spaltenangabe festgelegt: Die gewünschte Zeile wird durch Angabe eines Indizes
ermittelt. Die gewünschte Spalte wird durch den entsprechenden
Spaltenindex festgelegt. Der Zelleninhalt wird häufig als String zurückgeliefert.
VB.NET und Datenbanken, 25.01.10 Seite 90
Primärschlüssel
Dim keySpalte(1) As DataColumnDim mySpalte As DataColumn tblKunde.Columns.Add("IDKunde", System.Type.GetType("System.Int32"))tblKunde.Columns.Add("Anrede", System.Type.GetType("System.String"))tblKunde.Columns.Add("Kunde", System.Type.GetType("System.String"))tblKunde.Columns.Add("Strasse", System.Type.GetType("System.String"))tblKunde.Columns.Add("PLZ", System.Type.GetType("System.String"))tblKunde.Columns.Add("Ort", System.Type.GetType("System.String"))
keySpalte(0) = mySpaltetblKunde.PrimaryKey = keySpalte
VB.NET und Datenbanken, 25.01.10 Seite 91
Array
Dim keySpalte(1) As DataColumn … definiert ein Array von Spalten. Ein Array besteht aus vielen verschiedenen Elementen vom
gleichen Typ. Das Array hat den Namen keySpalte In runden Klammern wird die Anzahl der Elemente
angegeben. Hier besteht das Array aus einem Element. keySpalte(0) = 5
In den runden Klammern wird ein Index angegeben. In diesem Beispiel wird das erste Element eines Arrays
angesprochen.
VB.NET und Datenbanken, 25.01.10 Seite 92
Grafische Erläuterung
0
1
2
keySpalte(3)
DataColumn
DataColumn
DataColumn
VB.NET und Datenbanken, 25.01.10 Seite 93
Primärschlüssel
… identifiziert eindeutig eine Zeile in einer Tabelle. … kann aus mehreren Spalten zusammengesetzt werden. tblKunde.PrimaryKey legt den Primärschlüssel für die eine Tabelle
fest. In diesem Beispiel wird der Schlüssel für die Tabelle „tblKunde“ festgelegt. Eigenschaft und Objekt werden durch ein Punkt getrennt.
Mit Hilfe des Gleichheitszeichen wird der Eigenschaft ein Wert zugewiesen. In diesem Fall wird dem Schlüssel ein Array zugewiesen. Die einzelnen Elemente des Arrays enthalten die verschiedenen Schlüsselspalten. Aus den angegebenen Spalten wird der Schlüssel zusammengesetzt.
VB.NET und Datenbanken, 25.01.10 Seite 94
AutoWert nutzen
tblKunde.Columns.Add("IDKunde", System.Type.GetType("System.Int32")) tblKunde.Columns.Add("Anrede", System.Type.GetType("System.String")) tblKunde.Columns.Add("Kunde", System.Type.GetType("System.String")) tblKunde.Columns.Add("Strasse", System.Type.GetType("System.String")) tblKunde.Columns.Add("PLZ", System.Type.GetType("System.String")) tblKunde.Columns.Add("Ort", System.Type.GetType("System.String"))
mySpalte = tblKunde.Columns("IDKunde") mySpalte.AutoIncrement = True mySpalte.AutoIncrementSeed = 10 'Anfangswerte mySpalte.AutoIncrementStep = 1 'Inkrement mySpalte.ReadOnly = True
VB.NET und Datenbanken, 25.01.10 Seite 95
Erläuterung
Die Eigenschaft AutoIncrement bezieht sich immer auf eine Spalte in einer Tabelle.
Mit Hilfe der Eigenschaft AutoIncrementSeed wird der Anfangswert für den ersten Datensatz festgelegt.
Die Eigenschaft AutoIncrementStep legt die Schrittweite zwischen den einzelnen Werten fest.
Spalten mit einem AutoWert sollten schreibgeschützt werden.
VB.NET und Datenbanken, 25.01.10 Seite 96
Neue Datensätze
neueZeile = tblKunde.NewRow
neueZeile("Anrede") = txtAnrede.TextneueZeile("Vorname") = txtVorname.TextneueZeile("Nachname") = txtNachname.TextneueZeile("Strasse") = txtStrasse.TextneueZeile("PLZ") = txtPLZ.TextneueZeile("ort") = txtOrt.Text
tblKunde.Rows.Add(neueZeile)
VB.NET und Datenbanken, 25.01.10 Seite 97
Ablauf
Ein neues DataRow-Objekt wird erzeugt. Das Objekt symbolisiert den Aufbau einer Zeile in einer bestimmten Tabelle.
Anschließend wird jeder Spalte in dieser Zeile ein Wert zugewiesen.
Das neu erstellte Objekt wird der Tabelle als Datensatz hinzugefügt.
VB.NET und Datenbanken, 25.01.10 Seite 98
Neues Datenobjekt erzeugen
Die Methode tblKunde.NewRow erzeugt ... eine neue Zeile entsprechend dem Schema in der
angegebenen Tabelle. ... ein neues DataRow-Objekt.
Der Tabellennamen wird mit Hilfe des Punkts von der Methode getrennt.
Das erzeugte Objekt wird mit Hilfe des Gleichheitszeichens einer Variablen vom Typ DataRow zugewiesen.
Dim neueZeile As DataRow
neueZeile = tblKunde.NewRow
VB.NET und Datenbanken, 25.01.10 Seite 99
Wert einer Zelle zuweisen
Jede Spalte wird mit Hilfe des Gleichheitszeichens ein Wert zugewiesen. In diesem Beispiel wird der Inhalt eines Textfeldes einer Spalte zugewiesen.
Die gewünschte Spalte kann ... als Index in runden Klammern angegeben werden. Der
Spaltenname wird wie alle Strings durch Anführungszeichen begrenzt.
... durch ein Ausrufezeichen vom Namen der Zeile getrennt werden.
neueZeile("Anrede") = txtAnrede.Text
neueZeile!Anrede = txtAnrede.Text
VB.NET und Datenbanken, 25.01.10 Seite 100
… als Datensatz hinzufügen
Mit Hilfe der Methode .Add der Rows-Auflistung wird ein neuer Datensatz erzeugt.
In diesem Beispiel wird ein neuer Datensatz in der Tabelle tblKunde erzeugt.
Als Parameter wird der Methode die neue Zeile übergeben. Die Methode überprüft die Daten auf Gültigkeit und
Einschränkung. Zum Beispiel eine leere Zelle, deren Spalte keine Null-Werte erlaubt, erzeugt einen Fehler.
tblKunde.Rows.Add(neueZeile)
VB.NET und Datenbanken, 25.01.10 Seite 101
Datensätze suchen
Dim key As String Dim zeile As DataRow
key = tblKunde.Rows(posKunde).Item(0).ToString
If Not tblKunde.Rows.Contains(key) Then Exit Sub End If
zeile = tblKunde.Rows(posKunde)
VB.NET und Datenbanken, 25.01.10 Seite 102
Erläuterung
Der Methode .Contains() .. überprüft, ob ein Datensatz mit den angegebenen
Schlüssel vorhanden ist. … wird ein Wert für den Primärschlüssel übergeben. … gibt true (wahr) zurück, wenn der Schlüsselwert in der
Tabelle vorhanden ist.
VB.NET und Datenbanken, 25.01.10 Seite 103
Datensätze suchen
Dim key As Integer Dim zeile As DataRow Dim indexKey As Integer
indexKey = tblKunde.Columns.IndexOf("IDKunde")
key = CInt(tblKunde.Rows(posKunde).Item(indexKey).ToString)
zeile = tblKunde.Rows.Find(key) If (zeile Is Nothing) Then Exit Sub
tblKunde.Rows.Remove(tblKunde.Rows(posKunde))
VB.NET und Datenbanken, 25.01.10 Seite 104
Erläuterung
Der Methode .Find() … wird ein Wert für den Primärschlüssel übergeben. … gibt den Datensatz mit dem angegebenen
Primärschlüssel zurück. … gibt NULL zurück, wenn kein Datensatz mit den
angegeben Schlüsselwert vorhanden ist.
VB.NET und Datenbanken, 25.01.10 Seite 105
Datensätze ändern
Dim zeile As DataRowzeile = tblKunde.Rows(posKunde)
zeile.BeginEdit()zeile("Anrede") = txtAnrede.Textzeile("Vorname") = txtVorname.Textzeile("Nachname") = txtNachname.Textzeile("Strasse") = txtStrasse.Textzeile("PLZ") = txtPLZ.Textzeile("ort") = txtOrt.Textzeile.EndEdit()
tblKunde.AcceptChanges()
VB.NET und Datenbanken, 25.01.10 Seite 106
Status einer Datenzeile
Der Status einer Zeile kann mit Hilfe von RowState abgefragt werden. Hinzufügen, Added, 1 Löschen, Deleted, 2 Geändert, Modified, 4 Keine Änderung, Unchanged, 5
Die Methode .AcceptChanges() der DataTable übernimmt alle Änderungen an den Zeilen in die Tabelle. Die Methode wird häufig nach einem Update der Tabelle aufgerufen. Die Methode setzt den Status der geänderten und hinzugefügten Zeilen auf Unchanged. Zu entfernende Zeilen werden gelöscht.
VB.NET und Datenbanken, 25.01.10 Seite 107
Versionen einer Datenzeile lesen
In diesem Beispiel wird eine bestimmte Spalte einer Zeile angesprochen.
In den runden Klammern wird … eine Spaltenummer oder -bezeichnung sowie .. die gewünschte Version angegeben.
Mit Hilfe der Methode .HasVersion(DataRowVersion.Current) kann überprüft werden, ob die gewünschte Version vorhanden ist.
txtNachname.Text = zeile(indexID, DataRowVersion.Current).ToString
VB.NET und Datenbanken, 25.01.10 Seite 108
Mögliche Versionen
Orginal enthält die Originaldaten aus der Datenquelle. Neu hinzugefügte Datensätze besitzen keine Originaldaten.
Current beschreibt den aktuellen Wert eines Datensatzes. Gelöschte Datensätze verfügen über keine aktuelle Daten. Nach einer Änderungen der Daten haben Current und Original
unterschiedliche Werte. Proposed enthält den geänderten Wert, bevor dieser zum
aktuellen Wert wird. Der Nutzer schlägt einen neuen Wert für die Zelle vor.
Default arbeitet mit den eingestellten Default-Wert.
VB.NET und Datenbanken, 25.01.10 Seite 109
Bearbeitungsstatus
Die Methode .BeginEdit() startet den Bearbeitungsmodus. Die Methode .EndEdit() beendet den Bearbeitungsmodus einer
Zeile. Änderungen in diesem Modus lösen das Ereignis ColumnChanged
der DataTable aus.
VB.NET und Datenbanken, 25.01.10 Seite 110
Ereignis „Spalte geändert“
Private Sub onColumnChanged(ByVal sender As Object, ByVal args As DataColumnChangeEventArgs) Handles tblKunde.ColumnChanged ... If args.Column.ColumnName = "Nachname" Then If args.ProposedValue.ToString = String.Empty Then MsgBox("Der Nachname muss angegeben werden.") args.Row.CancelEdit()
zeile = args.Row indexID = tblKunde.Columns.IndexOf("Nachname") txtNachname.Text = zeile(indexID, DataRowVersion.Current).ToString End If End If
VB.NET und Datenbanken, 25.01.10 Seite 111
Erläuterung
Der Parameter args enthält verschiedene Informationen zu der zu ändernden Zeile.
Mit Hilfe von args.Column die zu ändernde Spalte in der Datenzeile beschrieben. Die Informationen können nur gelesen werden.
Mit Hilfe von args.Row kann auf die zu ändernde Datenzeile zugegriffen werden.
Die Eigenschaft ProposedValue enthält den geänderten Wert. Mit Hilfe der Methode .CancelEdit() wird die Änderung
zurückgenommen. Der Datensatz behält seine aktuellen Werte. Die vorgeschlagenen Werte werden nicht angenommen.
VB.NET und Datenbanken, 25.01.10 Seite 112
WithEvents
Es wird eine Variable tblKunde vom Objekttyp DataTable erstellt. Die Variable ist privat. Das heißt, sie ist nur innerhalb der
Klasse oder Prozedur bekannt, in der sie definiert ist. Diese Variable kann auf Ereignisse reagieren (WithEvents). In
diesem Beispiel reagiert die Tabelle auf das Ereignis „Spalte geändert“.
Jedes Steuerelement wird in [Form].Designer.vb mit dieser Zeile deklariert.
Private WithEvents tblKunde As DataTable
VB.NET und Datenbanken, 25.01.10 Seite 113
Datensätze löschen
Dim key As Integer Dim zeile As DataRow Dim indexKey As Integer
indexKey = tblKunde.Columns.IndexOf("IDKunde")
key = CInt(tblKunde.Rows(posKunde).Item(indexKey).ToString)
zeile = tblKunde.Rows.Find(key) If (zeile Is Nothing) Then Exit Sub
tblKunde.Rows.Remove(tblKunde.Rows(posKunde))
VB.NET und Datenbanken, 25.01.10 Seite 114
Hinweis
Der Datensatz wird aus den lokalen Speicher gelöscht. Ein Datensatz sollte nur aus der DataTable gelöscht werden,
wenn die Daten in eine elektronische Datei gespeichert werden.
Falls eine Datenbank als Datenquelle existiert, müssen die Daten synchronisiert werden.