VB.NET Nutzung von ADO.NET

VB.NET – Nutzung von ADO.NET ADO.NET      … bietet einen Zugriff auf relationale Datenbanken. … ist eine Programmierschnittstelle für den Zugr...
Author: Louisa Brahms
185 downloads 1 Views 524KB Size
VB.NET – Nutzung von ADO.NET

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 2

OleDB-Verbindung herstellen Imports System.Data.OleDb Public 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 Sub End Class VB.NET und Datenbanken, 25.01.10

Seite 3

Namespace importieren Imports System.Data.OleDb  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.

VB.NET und Datenbanken, 25.01.10

Seite 4

Namespace Imports System.Data.OleDb  … 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.

VB.NET und Datenbanken, 25.01.10

Seite 5

Beispiel Imports System.Data.OleDb

 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 OLEDatenbanken. O(bject)L(inking)E(mbedding) bietet die Möglichkeit auf Datenquellen in Tabellenform zuzugreifen.

VB.NET und Datenbanken, 25.01.10

Seite 6

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 7

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 ImportsAnweisung eingebunden werden.  … direkt angegeben werden.

VB.NET und Datenbanken, 25.01.10

Seite 8

Mögliche „Baupläne“ für eine Datenverbindung Dim connect As New System.Data.OleDb.OleDbConnection() Dim connect As New System.Data.SqlClient.OleDbConnection()  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.

VB.NET und Datenbanken, 25.01.10

Seite 9

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 10

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 11

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 AccessDatenbank aufgebaut.

VB.NET und Datenbanken, 25.01.10

Seite 12

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 13

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 WindowsIdentifikation am Rechner.

VB.NET und Datenbanken, 25.01.10

Seite 14

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 15

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 16

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 17

… 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 18

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 19

… 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 20

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 21

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 22

Arbeitsablauf: Keine Fehler vorhanden Try dbConnect.Open() End Try

 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.

VB.NET und Datenbanken, 25.01.10

Seite 23

Arbeitsablauf: Fehler vorhanden Try dbConnect.Open() Catch ex As Exception MessageBox.Show(ex.Message, "Fehler") End Try

 Falls ein Fehler aufgetreten ist, wird eine Exception (Ausnahme) ausgelöst.  Die Exception wird mit Hilfe des Schlüsselwortes Catch abgefangen.

VB.NET und Datenbanken, 25.01.10

Seite 24

Welcher Fehler wird abgefangen? Try dbConnect.Open() Catch ex As Exception MessageBox.Show(ex.Message, "Fehler") End Try

 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. VB.NET und Datenbanken, 25.01.10

Seite 25

Arbeitsablauf: Aufräumen Try dbConnect.Open() Catch ex As Exception MessageBox.Show(ex.Message, "Fehler") Finally dbConnect.Close() End Try

 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.

VB.NET und Datenbanken, 25.01.10

Seite 26

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 OleDbCommand Dim 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 27

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 28

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 29

Arbeitsablauf  Das Command-Objekt wird deklariert.  Im nächsten Schritt wird das Command-Objekt mit einer SqlAnweisung 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 30

Variable für ein Command-Objekt deklarieren Dim dbCommand As OleDbCommand = Nothing

 Eine Variable vom Typ des Command-Objekts wird deklariert.  Die Variable wird mit Nothing (Nichts) initialisiert. Sie verweist auf kein Objekt.

VB.NET und Datenbanken, 25.01.10

Seite 31

Command-Objekt initialisieren Dim dbCommand As OleDbCommand = Nothing sqlText = "SELECT Firma, Anrede, Ansprechpartner, Strasse, PLZ, Ort FROM tblKunde;" dbCommand = New OleDbCommand(sqlText, dbConnect)

 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.

VB.NET und Datenbanken, 25.01.10

Seite 32

Geänderte Datensätze in einem DataSet Dim dataRow As DataRow Dim dataTable As DataTable dataTable = 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).ToString Next dataRow VB.NET und Datenbanken, 25.01.10

Seite 33

Auflistung der geänderten Datensätze Dim dataTable As DataTable dataTable = Me.KundenAdresseDataSet.Tables("tblKunde").GetChanges

 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).

VB.NET und Datenbanken, 25.01.10

Seite 34

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 35

Zellen in einer Zeile For Each dataRow In dataTable.Rows … sqlText = sqlText & ", PLZ = '" & dataRow.Item(5).ToString & "'" Next dataRow

 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. VB.NET und Datenbanken, 25.01.10

Seite 36

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 37

Zellen in einer Zeile For Each dataRow In dataTable.Rows … Next dataRow

 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. VB.NET und Datenbanken, 25.01.10

Seite 38

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 = dbConnect dbCommand.CommandText = sqlText dbCommand.ExecuteNonQuery() dbConnect.Close() VB.NET und Datenbanken, 25.01.10

Seite 39

SQL-Anweisung UPDATE sqlText = "UPDATE tblKunde SET" … sqlText = sqlText & ", PLZ = '" & dataRow.Item(5).ToString & "'" sqlText = sqlText & " WHERE IDKunde = " & dataRow.Item(0).ToString

 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. VB.NET und Datenbanken, 25.01.10

Seite 40

Eigenschaften des Command-Objekts dbCommand.Connection = dbConnect dbCommand.CommandText = sqlText  Die Eigenschaft Connection beschreibt immer die Verbindung zu der Datenbank eines Command-Objekts.  CommandText enthält die auszuführende SQL-Anweisung.

VB.NET und Datenbanken, 25.01.10

Seite 41

SQL-Anweisung ausführen dbCommand.ExecuteNonQuery()

 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.

VB.NET und Datenbanken, 25.01.10

Seite 42

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 43

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 44

Wo werden die Daten eingefügt? INSERT INTO autor ( vorname, nachname ) ...  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.

VB.NET und Datenbanken, 25.01.10

Seite 45

Welche Daten werden eingefügt? INSERT INTO autor ( vorname, nachname ) SELECT newautor.vorname, newautor.nachname FROM newautor INSERT INTO autor ( vorname, nachname ) VALUES ("Tim", "Regen")

 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.

VB.NET und Datenbanken, 25.01.10

Seite 46

Selektierte Datensätze in einem DataGridView... Dim selectedRow As DataGridViewRow Dim lstIDKunde As String lstIDKunde = "" 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 47

Selektierte Datensätze Dim selectedRow As DataGridViewRow For Each selectedRow In Me.ShowKundeAdresse.SelectedRows

 … werden in der Auflistung SelectedRows gesammelt.  … sind vom Datentyp DataGridViewRow und nicht DataRow.

VB.NET und Datenbanken, 25.01.10

Seite 48

Werte einer Zelle in einer selektierten Zeile lstIDKunde = selectedRow.Cells.Item(0).Value.ToString

 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.

VB.NET und Datenbanken, 25.01.10

Seite 49

Selektierte Datensätze löschen Me.ShowKundeAdresse.Rows.Remove(selectedRow)

 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.

VB.NET und Datenbanken, 25.01.10

Seite 50

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 51

SQL-Anweisung DELETE sqlText = "DELETE FROM tblKunde “ sqlText = sqlText & “WHERE IDKUNDE IN(" & lstIDKunde & ")"

 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.

VB.NET und Datenbanken, 25.01.10

Seite 52

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 OleDbCommand Dim 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 53

Erläuterung Dim dbReader As OleDbDataReader dbReader = dbCommand.ExecuteReader()  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.

VB.NET und Datenbanken, 25.01.10

Seite 54

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 55

Grafische Darstellung DataReader

Command

Connection Datenquelle

VB.NET und Datenbanken, 25.01.10

Seite 56

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 57

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 Loop End Try

VB.NET und Datenbanken, 25.01.10

Seite 58

Erläuterung Dim dbReader As OleDbDataReader dbReader = dbCommand.ExecuteReader() Do While dbReader.Read() ... Loop  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.

VB.NET und Datenbanken, 25.01.10

Seite 59

Anweisungen wiederholen Do While dbReader.Read() ... Loop  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. VB.NET und Datenbanken, 25.01.10

Seite 60

Untypisierte Daten aus den Spalten lesen strAusgabe = dbReader("Firma").ToString

 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.

VB.NET und Datenbanken, 25.01.10

Seite 61

Weitere Möglichkeit strAusgabe = dbReader("Firma").ToString strAusgabe = dbReader.Item("Firma").ToString

 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. VB.NET und Datenbanken, 25.01.10

Seite 62

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 63

Typisierte Daten aus den Spalten lesen strAusgabe = dbReader("Firma").ToString strAusgabe = dbReader.Item("Firma").ToString strAusgabe = strAusgabe & ControlChars.NewLine & dbReader.GetString(0)

 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. VB.NET und Datenbanken, 25.01.10

Seite 64

Texte verknüpfen strAusgabe = dbReader("Firma").ToString strAusgabe = strAusgabe & ControlChars.NewLine & dbReader.GetString(0)

 Mit Hilfe des kaufmännischen Unds werden verschiedene Texte aneinandergereiht.  ControlChars definiert Sonderzeichen wie eine neue Zeile (ControlChars.NewLine), Tabulator etc.

VB.NET und Datenbanken, 25.01.10

Seite 65

Sind Datensätze vorhanden? Try ... dbReader = dbCommand.ExecuteReader() If dbReader.HasRows Then Do While dbReader.Read() ... Loop End Try

 Mit Hilfe der Methode .HasRows kann abgefragt werden, ob Datensätze vorhanden sind oder nicht.

VB.NET und Datenbanken, 25.01.10

Seite 66

DataReader schließen dbReader.Close()

 Der Cursor wird nach dem Lesen aller Datensätze geschlossen.  Eine geöffneter DataReader blockiert die Verbindung. Die genutzte Verbindung kann nicht von anderen CommandObjekten verwendet werden.

VB.NET und Datenbanken, 25.01.10

Seite 67

DataAdapter  … füllt immer Tabellen in Abhängigkeit einer SELECTAnweisung.  … 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 68

Grafische Darstellung Lokale Datenspeicher Dataset Tabelle 1

Tabelle 2

Tabelle 1

Datenadapter

Datenbank VB.NET und Datenbanken, 25.01.10

Seite 69

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 70

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 71

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 72

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 73

Parameter zum UpdateCommand Dim parameter As OleDbParameter With 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 74

Erläuterung: Add-Methode  In der Auflistung Parameters werden alle Parameter der SqlAnweisung 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 75

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 76

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 77

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 78

DeleteCommand sqlText = "DELETE FROM tblKunde WHERE IDKunde = ?" dataAdapter.DeleteCommand = New OleDbCommand(sqlText, dbConnect) parameter = New OleDbParameter("IDKundeOld", OleDbType.UnsignedBigInt, 30000, "IDKunde") parameter.SourceVersion = DataRowVersion.Original dataAdapter.DeleteCommand.Parameters.Add(parameter)

VB.NET und Datenbanken, 25.01.10

Seite 79

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 80

Ä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 81

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 82

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 83

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 84

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 85

Index einer Spalte 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)

VB.NET und Datenbanken, 25.01.10

Seite 86

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 87

Inhalt einer Spalte einer Zeile 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)

VB.NET und Datenbanken, 25.01.10

Seite 88

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 89

Primärschlüssel Dim keySpalte(1) As DataColumn Dim 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) = mySpalte tblKunde.PrimaryKey = keySpalte

VB.NET und Datenbanken, 25.01.10

Seite 90

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 91

Grafische Erläuterung

keySpalte(3)

VB.NET und Datenbanken, 25.01.10

0

DataColumn

1

DataColumn

2

DataColumn

Seite 92

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 93

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 94

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 95

Neue Datensätze neueZeile = tblKunde.NewRow neueZeile("Anrede") = txtAnrede.Text neueZeile("Vorname") = txtVorname.Text neueZeile("Nachname") = txtNachname.Text neueZeile("Strasse") = txtStrasse.Text neueZeile("PLZ") = txtPLZ.Text neueZeile("ort") = txtOrt.Text tblKunde.Rows.Add(neueZeile)

VB.NET und Datenbanken, 25.01.10

Seite 96

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 97

Neues Datenobjekt erzeugen Dim neueZeile As DataRow neueZeile = tblKunde.NewRow  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. VB.NET und Datenbanken, 25.01.10

Seite 98

Wert einer Zelle zuweisen neueZeile("Anrede") = txtAnrede.Text neueZeile!Anrede = txtAnrede.Text  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. VB.NET und Datenbanken, 25.01.10

Seite 99

… als Datensatz hinzufügen tblKunde.Rows.Add(neueZeile)  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.

VB.NET und Datenbanken, 25.01.10

Seite 100

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 101

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 102

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 103

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 104

Datensätze ändern Dim zeile As DataRow zeile = tblKunde.Rows(posKunde) zeile.BeginEdit() zeile("Anrede") = txtAnrede.Text zeile("Vorname") = txtVorname.Text zeile("Nachname") = txtNachname.Text zeile("Strasse") = txtStrasse.Text zeile("PLZ") = txtPLZ.Text zeile("ort") = txtOrt.Text zeile.EndEdit() tblKunde.AcceptChanges() VB.NET und Datenbanken, 25.01.10

Seite 105

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 106

Versionen einer Datenzeile lesen txtNachname.Text = zeile(indexID, DataRowVersion.Current).ToString

 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.

VB.NET und Datenbanken, 25.01.10

Seite 107

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 108

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 109

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 110

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 111

WithEvents Private WithEvents tblKunde As DataTable

 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. VB.NET und Datenbanken, 25.01.10

Seite 112

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 113

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.

VB.NET und Datenbanken, 25.01.10

Seite 114