addendum – ado.net
DESCRIPTION
Addendum – ADO.NET. ADO.NET : het object model .NET Data Providers Connecteren met een database : Connection Uitvoeren van SQL Query : Command Lezen van data : De DataReader De DataAdapter De DataSet. ADO.NET. Het ADO.Net Object model. .NET Data Providers. Data Provider. - PowerPoint PPT PresentationTRANSCRIPT
Visual Basic.NET Pag.1
Addendum – ADO.NET• ADO.NET : het object model• .NET Data Providers
• Connecteren met een database : Connection
• Uitvoeren van SQL Query : Command
• Lezen van data : De DataReader
• De DataAdapter
• De DataSet
Visual Basic.NET Pag. 2ADO.NET
ADO.NET
• Het ADO.Net Object model
Visual Basic.NET Pag. 3ADO.NET
.NET Data Providers• Alle toegang in ADO.NET tot data sources gebeurt o.b.v. .NET Data
providers. Is een verzameling klassen die code in staat stelt om met een specifieke gegevensbron te communiceren om gegevens op t ehalen, te bewerken.
• .NET Framework bevat 2 .NET Data Providers SQL Server Data Provider: geoptimaliseerde toegang tot SQL Server
– Geimplementeerd in de System.Data.SqlClient Namespace OLEDB Data Provider : toegang tot alle gegevensbronnen waarvoor OLE DB provider
geinstalleerd– Geimplementeerd in de System.Data.OleDb Namespace– Vereisen installatie van MDAC 2.7 of later
• Importeer namespace .NET Data Provider in projectImports System.Data.SqlClientImports System.Data.OleDb
Data Provider
Visual Basic.NET Pag. 4ADO.NET
Connecteren met een database
• Connecteren met de database : Connection Object
Connections zijn verantwoordelijk voor het onderhouden van de fysieke verbinding tussen gegevensbron en .NET applicatie
Elke Data Provider implementeert eigen versie van connection klasseSqlConnection in namespace System.Data.SQLClient
OleDBConnection in namespace System.Data.OleDb
Connection
Object
Data Provider
Visual Basic.NET Pag. 5ADO.NET
Connecteren met een database• Connecteren met een data source via OleDbConnection
Stel connection type inDim oConn as New OleDbConnection()
Geef data source op. ConnectionString property bevat de string die gebruikt wordt om de
verbinding met de gegevensbron te maken als de methode open wordt uitgevoerd
oConn.ConnectionString =“Provider=Microsoft.Jet.OLEDB.4.0;Data Source =“ & Application.StartUpPath & “\northwind.mdb”
Connecteer met data sourceoConn.Open()
Sluiten van verbindingIf (not oConn is Nothing) AndAlso (oConn.State = ConnectionState.Open) then
oConn.close
End If
Opm : Niet vergeten want verbindingen worden niet automatisch gesloten als ze de scope verliezen
Visual Basic.NET Pag. 6ADO.NET
Connecteren met een database Of verkort op basis van constructor
Dim strConn = =“Provider=Microsoft.Jet.OLEDB.4.0;Data Source =“ & Application.StartUpPath & “\northwind.mdb”
Dim oConn as New OleDbConnection(strConn)
oConn.Open
oConn.Close
Visual Basic.NET Pag. 7ADO.NET
Connecteren met een database De connectionstring (formaat afhankelijk van namespace SqlClient of
OleDB)
SqlConnection
“Data Source =name or IP adress server;Password=password;User ID=userID;Initial Catalog=databasename;Integrated Security=True”
OleDbConnection (inhoud afhankelijk van OleDb Provider)
– Hard gecodeerd
» Microsoft Access 2000
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=physical path to mdb
file;Password=password;User ID=userID;
» SQL Server
"Provider=SQLOLEDB;Data Source=name or IP adress server;Password=password;
User ID=userID;Initial Catalog=databasename;Integrated Security=True”
» Oracle
"Provider=MSDAORA;Data Source=name server;Password=password;User ID=userID;
Initial Catalog = databasename;
Visual Basic.NET Pag. 8ADO.NET
Connecteren met een database
– Via UDL file (Microsoft Data Link file)
» Ga naar Windows Explorer
1. Dubbelklik bin directory van project
2. Rechtermuisklik in rechter venster > File > New > Text document
3. Rename gecreeerde tekst bestand. Pas extensie aan in .udl, en geef een duidelijke naam bvb Northwind.udl
4. Dubbelklik bestand. Het Data Link Property dialoogvenster verschijnt.
» Openen van connection o.b.v. Udl file
"File Name=" & Application.StartupPath & "\northwind.udl“
Opmerking : maak zoveel mogelijk gebruik van trusted verbindingen (via Windows verificatie)
Visual Basic.NET Pag. 9ADO.NET
Connecteren met een database
• Connection Properties Database of Initial Catalog: de naam van de database die moet worden
geopend zodra de verbinding tot stand komt DataSource : de naam server of locatie van bestand dat de database
bevat ConnectionString : connectionstring gebruikt voor maken verbinding ConnectionTimeOut : de maximale tijd(in seconden) dat het connection
object probeert verbinding te maken vooraleer een foutmelding verschijnt (default 15 sec)
Provider (enkel igv OleDbConnection) : Naam OleDB Data Provider State : status huidige connectie
– Closed : gesloten. (Status na uitvoeren Close methode)– Open : open en actief (Status na uitvoeren Open methode)– Broken : connectie is niet meer bruikbaar (netwerk probleem,...)– Connecting : connectie is bezig verbinding te maken– Executing : de connection voert een Command uit– Fetching : De connection haalt gegevens op
Opm : allen read-only, behalve connectionstring
Visual Basic.NET Pag. 10ADO.NET
Connecteren met een database
• Connection EventsStateChanged : als toestand van object Connection verandert
– Geeft een StateChangeEventArgs door aan handler met 2 eigenschappen (mogelijke waarden idem property State)
» CurrentState» OriginalState
– VoorbeeldDim theMessaqe as StringtheMessage = “The connection is changing from “ & _ e.OriginalState.ToString & “ to “ & _ e.CurrentState.ToStringMessagebox.Show(theMessage)
Visual Basic.NET Pag. 11ADO.NET
Connecteren met een database
• Opvangen van foutenTry
oConn = New OleDbConnection()
oConn.connectionstring =“Provider=Microsoft.Jet.OLEDB.4.0;Data Source =“ & Application.StartUpPath & “\northwind.mdb”
oConn.Open()
Catch ex As OleDbException
Messagebox.Show(ex. Message)
Next
End Try
Visual Basic.NET Pag. 12ADO.NET
Connecteren met een database
• Tip voor maken van een verbinding tijdens het ontwerpen
Open de Server Explorer
Klik op de knop Connect to Database. Het Data Link Property dialoogvenster verschijnt
Na instellen van Provider en Connection details, klik op OK. De connectie wordt toegevoegd aan de Server Explorer
Nu kan je de inhoud van db bekijken en eventueel via drag drop een connection object op form aanmaken
Visual Basic.NET Pag. 13ADO.NET
Uitvoeren van SQL instructie• Uitvoeren SQL (SELECT, INSERT, UPDATE, DELETE,
DDL of DCL) of Stored Procedure : Command object
• Is .NET Data Provider afhankelijk SQLCommand
OleDbCommand
Connection
Object
Data Provider
Command
Object
Uitvoeren
SQL statement
1.
2.
Visual Basic.NET Pag. 14ADO.NET
Uitvoeren van SQL instructie• Creatie Command object
Dim oCmd As New OleDbCommand()
• Opgave van het uit te voeren SQL Statement of Stored Procedure Dim strSQL as String
strSQL = "select categoryid, categoryName from categories“
oCmd.CommandText = strSQL
oCmd.CommandType = CommandType.Text
• Opgave van connectie waarop de Command moet worden uitgevoerdoCmd.Connection = oConn
• Uitvoeren SQL Statement of Stored Procedure Igv Select
Dim oDR as OleDbDataReader
oDR = oCmd.ExecuteReader()
Igv Update, Insert, Delete (je krijgt geen resultaat terug)oCmd.ExecuteNonQuery()
Of verkort 2, 3 via constructor : oCmd = New OleDbCommand(strSQL,oConn)
Visual Basic.NET Pag. 15ADO.NET
Uitvoeren van SQL instructie• Command properties
CommandText : de SQL instructie of stored procedure die moet worden uitgevoerd
CommandTimeOut : de wachttijd(in seconden) op een reactie van de gegevensbron
CommandType : geeft aan hoe de Commandtext property geinterpreteerd moet worden. Mogelijke waarden : Text(default), TableDirect, StoredProcedure
Connection : het connection object waarop de Data Command moet worden uitgevoerd
Parameters : de verzameling Parameters voor SQL instructie of Stored Procedure
Transaction : het object Transaction waarbinnen de opdracht wordt uitgevoerd
UpdatedRowSource : bepaalt hoe de resultaten worden toegepast op een rij als de Command wordt gebruikt door de methode Update van de DataAdapter
Visual Basic.NET Pag. 16ADO.NET
Uitvoeren van SQL instructie
• Uitvoeren van Query of stored procedure
Via de Command methodesExecuteNonQuery : voert een opdracht op Connection uit en
geeft het aantal rijen terug dat daardoor wordt beïnvloed; Gebruik dit wanneer SQL statement geen resultaat retourneert nl bij INSERT, UPDATE of DELETE
– Voorbeeld SQL Statements
» UPDATE Customers SET CompanyName = 'NewCompanyName' WHERE CustomerID = 'ALFKI'
» INSERT INTO Customers (CustomerID, CompanyName)VALUES ('NewID', 'NewCustomer')
» DELETE FROM Customers WHERE CustomerID = 'ALFKI'
Visual Basic.NET Pag. 17ADO.NET
Uitvoeren van SQL instructie– Voorbeeld programmacode
Dim oConn As New OleDbConnection() Dim oCmd As OleDbCommand Dim strSQL As String Dim strConn As String
‘Maken database verbinding strConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source =" & _ Application.StartupPath & "\northwind.mdb" oConn.Connectionstring = strConn oConn.Open() ‘Creatie SQL Statement strSQL = "UPDATE Customers" strSQL &= " SET CompanyName = 'NewCompanyName'" strSQL &= " WHERE CustomerID = 'ALFKI'" oCmd = New OleDbCommand(strSQL, oConn) ‘Uitvoeren SQL Statement Dim intRecordsAffected As Integer intRecordsAffected = oCmd.ExecuteNonQuery() If intRecordsAffected = 1 Then MessageBox.Show("Update succeeded") Else 'Assume intRecordsAffected = 0 MessageBox.Show("Update failed") End If oConn.Close()
Visual Basic.NET Pag. 18ADO.NET
Uitvoeren van SQL instructie
ExecuteReader : voert de instructie uit op het Connection object en stelt een DataReader samen die het resultaat bevat.
– Voorbeeld SQL Statement"SELECT CustomerID, CompanyName FROM Customers"
Visual Basic.NET Pag. 19ADO.NET
Uitvoeren van SQL instructie– Voorbeeld programmacode
Dim oConn As OleDbConnection() Dim oCmd As OleDbCommand Dim strSQL As String Dim strConn As String
‘Maken database verbinding strConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source =" & _ Application.StartupPath & "\northwind.mdb" oConn = New OleDbConnection(strConn) oConn.Open() ‘Creatie SQL Statement strSQL = "SELECT CustomerID, CompanyName FROM Customers"
oCmd = New OleDbCommand(strSQL, oConn) ‘Uitvoeren SQL Statement en doorlopen resultaatset Dim oDR As OleDbDataReader = oCmd.ExecuteReader() Dim strMsg As String While oDR.Read() strMsg &= oDR.Item("CustomerID") & " – " & oDR.Item("CompanyName")
strMsg &= vbCrLf End While
‘Sluit DataReader!!!!! oDR.Close() MessageBox.Show(strMsg) oConn.Close()
Visual Basic.NET Pag. 20ADO.NET
Uitvoeren van SQL instructie
ExecuteScalar– Als de query 1 resultaat retourneert
» Count(*), Avg(UnitsInStock),...– Laat toe de waarde in 1 stap op te halen
Strsql=“select count(*) from Customers”Dim oCcmd as new OleDbCommand(strSQL, oConn)Dim aantal as integeraantal=oCmd.executeScalar()
Visual Basic.NET Pag. 21ADO.NET
Uitvoeren van SQL instructie
• Gebruik van parameters
3 stappenParameters opgeven in de query
Parameters opgeven in de verzameling Parameters
Waarden aan parameters opgeven
Opgeven QueryIn OleDbCommand : ?
oCmd.CommandText = “Select * from customers where customerID = ?”
In SqlDbCommand : benoemde parametersoCmd.CommandText= “Select * from customers where customerID = @custID”
Toevoegen parameters aan verzameling ParametersoCmd.Parameters.Add(“CustomerID", OleDbType.WChar, 5)
Instellen Parameterwaarden oCmd.parameters(“CustomerID”).value = ....
Visual Basic.NET Pag. 22ADO.NET
Uitvoeren van SQL instructie– Voorbeeld programmacode
Dim oConn As OleDbConnection() Dim oCmd As OleDbCommand Dim strSQL As String Dim strConn As String
‘Maken database verbinding strConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source =" & _ Application.StartupPath & "\northwind.mdb" oConn = new OleDbConnection(strConn) oConn.Open() ‘Creatie SQL Statement en Parameters
strSQL = "SELECT CustomerID, CompanyName FROM Customers" strSQL &= " WHERE CustomerID = ?"
oCmd = New OleDbCommand(strSQL, oConn) oCmd.Parameters.Add("CustomerID", OleDbType.WChar, 5) oCmd.Parameters("CustomerID").Value = "ALFKI“
‘Uitvoeren SQL Statement en doorlopen resultaatset Dim oDR As OleDbDataReader = oCmd.ExecuteReader() Dim strMsg As String While oDR.Read() strMsg &= oDR.Item("CustomerID") & " – " & oDR.Item("CompanyName")
strMsg &= vbCrLf End While oDR.Close() MessageBox.Show(strMsg) oConn.Close()
Visual Basic.NET Pag. 23ADO.NET
Uitvoeren van SQL instructie
• Voorbeeld : Product Information
Maak nieuwe Windows Applicatie met naam Products
Creëer form
Codeer Load event van formPrivate Sub frmProduct_Load( ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
ListLoad()
End Sub
Codeer ListLoad procedure
Control Property ValueForm Name frmProducts
Text Product InformationListBox Name lstProducts
Visual Basic.NET Pag. 24ADO.NET
Uitvoeren van SQL instructiePrivate Sub ListLoad()
Dim oConn As OleDbConnection
Dim oCmd As OleDbCommand
Dim oDr As OleDbDataReader
Dim strSQL As String = "Select ProductName from Products"
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source =" & ....
Try
oConn = New OleDbConnection(strConn)
oCmd = New OleDbCommand(strSQL, oConn)
oConn.Open()
oDr = oCmd.ExecuteReader()
lstProducts.Items.Clear()
Do While oDr.Read()
lstProducts.Items.Add(oDr.Item("ProductName"))
Loop
oDR.Close()
Catch ex As OleDbException
MessageBox.Show(ex.Message)
Finally
If (Not oConn Is Nothing) AndAlso (oConn.State = ConnectionState.Open) Then oConn.close()
End Try
End Sub
Visual Basic.NET Pag. 25ADO.NET
Lezen van Data : De DataReader• Kenmerken
DataReader is forward-only en read-only data
Kan slechts 1 keer gebruikt worden
Rijen worden 1/1 in geheugen geladen
DataReader kan niet gebruikt worden als DataSource!!
• Afhankelijk van .NET Data Provider
• Hoe gebruiken?
Call Command.ExecuteReader
Itereer door data met DataReader.Read
Lees Kolom data
Sluit DataReader!!!!!
Connection
Object
Data Provider
Command
Object
Uitvoeren
SQL statement
2.
DataReader
Object
3.
1.
Visual Basic.NET Pag. 26ADO.NET
De DataReader
• Creatie DataReaderDim oDRAs OleDbDataReader
....
oDR=oCmd.ExecuteReader()
• Doorlopen van DataReaderDo While oDR.Read
Messagebox.Show(oDR(0).ToString & ...)
Loop
• Sluiten DataReader (niet vergeten!!)oDR.Close()
Opmerking : Zolang DataReader object niet afgesloten, kan geen enkele SQL query nog worden uitgevoerd gebruik makend van bijhorend connection object
Visual Basic.NET Pag. 27ADO.NET
De DataReader
• Ophalen van gegevens uit DataReader
Via de collectie van Get methodes (meest performant)GetString, GetInt16, GetInt32, GetDateTime,...
Get methodes hebben 1 parameter : volgnr van veld
Bevat ook een IsNull methode (true als veld NULL bevat)Do While oDR.Read
MessageBox.Show(oDR.GetInt32(0) & “ “ & oDR.GetString(1))
Loop
Via de Item property Array (via index of naam veld)Do While oDR.Read
MessageBox.Show(cint(oDR(“categoryid”)) & “ “ & oDR(“categoryName”))
Loop
Visual Basic.NET Pag. 28ADO.NET
De DataReader
• Voorbeeld Product Information - revised DataReader kan je niet binden aan een listbox.
Hoe moet je op basis van de productnaam productgegevens terugvinden, indien productnaam niet uniek?
Oplossing : Maak een generische klasse ListItem
Klik Project > Add Class
Geef naam clsItemLists.vb
Geef code in
Gebruik die klasse in de listLoad procedure
Visual Basic.NET Pag. 29ADO.NET
Public Class clsItemList
Private mValue As String ‘bevat de text
Private mID As Integer ‘bevat de primaire sleutel
Public Sub New(ByVal strValue As String,ByVal intID As Integer)
mValue = strValue
mID = intID
End Sub
Property Value() As String
Get
Return mValue
End Get
Set(ByVal Value As String)
mValue = Value
End Set
End Property
Property ID() As Integer
Get
Return mID
End Get
Set(ByVal Value As Integer)
mID = Value
End Set
End Property Public Overrides Function ToString() As String ‘opgeroepen door listbox voor tonen van waarde object
Return mValue
End Function
End Class
Visual Basic.NET Pag. 30ADO.NET
Private Sub ListLoad()
Dim oConn As OleDbConnection()
Dim oCmd As OleDbCommand()
Dim oDr As OleDbDataReader
Dim oItem as clsItemList
Dim strSQL as String= “Select ProductID, ProductName from Products order by ProductName”
Dim strConn as String= “Provider=...
Try
oConn = new OleDbConnection(strConn)
oCmd = new OleDbCommand(strSQL,oConn)
oConn.Open()
oDr = oCmd.ExecuteReader()
lstProducts.Items.Clear()
Do while oDr.Read()
oItem = New clsItemList(oDr.Item(“ProductName”).ToString(), cint(oDR.Item(“ProductID”)),)
lstProducts.Items.Add(oItem)
Loop
oDr.Close
If lstProducts.Items.Count > 0 then lstproducts.SetSelected(0,True)
Catch ex As OleDbException
MessageBox.Show(ex.Message)
Finally
If (Not oConn Is Nothing) AndAlso (oConn.State = ConnectionState.Open) Then oConn.close()
End TryEnd Sub
Visual Basic.NET Pag. 31ADO.NET
De DataAdapter
• Brug tussen gegevensbron en DataSet object. SQLDataAdapter OleDbDataAdapter
SqlDataAdapter
• DataSet heeft nooit een live connection met datasource. De DataAdapter connecteert met datasource, voert query uit en geeft resultaat door aan DataSet of voert wijzigingen uit DataSet uit op dataSource
Connection
Object
Data Provider
Command
Object
Uitvoeren
SQL statement
DataAdapter
Object DataTables
DataSet
Visual Basic.NET Pag. 32ADO.NET
De DataAdapter
• Ophalen van data -> vullen van een dataset DataAdapter
Fill : voert select statement uit en slaat resultaat op in DataTable in DataSet Update : voert wijzigingen in DataTable in DataSet door in database
Je hebt geen open connectie nodig. De Fill/update methode opent de connectie, manipuleert data en sluit de connectie
Creatie DataAdapterDim strConn As String
strConn = “Provider=Microsoft.Jet.OLEDB.4.0;”
strConn &= “Data Source =“ & Application.StartUpPath & “\northwind.mdb”
Dim oConn As New OleDbConnection(strConn)
Dim oCmd As New OleDbCommand(“Select * from Customers”, oConn)
oDA = New oleDbDataAdapter()
oDA.SelectCommand = oCmd
of verkort via DataAdapter ConstructorDim strConn As String = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source ...”
Dim oConn As New OleDbConnection(strConn)
Dim strSQl as String = “Select * from Customers”
Dim oDA = New oleDbDataAdapter(strSQl, oConn)
Visual Basic.NET Pag. 33ADO.NET
De DataAdapter
Vullen van DataSetDim oDs as New DataSet()oDA.MissingSchemaAction = MissingSchemaAction.AddWithKeyoDa.Fill(oDs,”Customers”)
De connectie met de database zal enkel bestaan tijdens de uitvoering van de Fill.
Het schema van de DataTable Customers wordt automatisch gegenereerd, en is gebaseerd op de definitie van de tabel in de data source.
In DataSet NorthWind wordt tabel gecreëerd met naam Customers (en gemapped met tabel Customer)
Visual Basic.NET Pag. 34ADO.NET
De DataAdapter
2SQL query
XML Web Services
XML4 DataSetResults
3
Data Source
5 Updated XML DataSet 6SQL updates
Request data1
Client
Visual Basic.NET Pag. 35ADO.NET
De DataSet
Disconnected verzameling gegevens bijgehouden in de cache.
Bevat een collectie van tabellen, relaties en constraints in XML formaat.
Staat altijd los van een gegevensbron
Constraints Constraint
Columns Column
DataSet
Tables Table
ObjectCollection
Relations Relation
Rows Row
Visual Basic.NET Pag. 36ADO.NET
De DataSet
Tables : collectie van table objecten
Table : een tabel bestaande uit kolommen, rijen en constraintsJe kan meerdere tabellen in 1 dataset ladenDim oConn As New OleDbConnection(strConn)
Dim daCustomers, daOrders As OleDbDataAdapter
daCustomers = New OleDbDataAdapter("SELECT ... FROM Customers", oConn )
daOrders = New OleDbDataAdapter("SELECT ... FROM Orders", oConn )
Dim ds As New DataSet()
daCustomers.Fill(ds)
daOrders.Fill(ds)
Visual Basic.NET Pag. 37ADO.NET
De DataSet Columns : is een collectie van DataColumn objecten
DataColumn : definiëren schema van DataTable Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0; =..."
Dim strSQL As String = "SELECT * FROM Customers"
Dim oConn As New OleDbConnection(strConn)
Dim oDa As New OleDbDataAdapter(strSQL, oConn)
Dim oDs As New DataSet()
oDa.Fill(oDs, "Customers")
Dim oTbl As DataTable = oDs.Tables("Customers")
Dim strMsg As String
strMsg = "Column information for " & oTbl.TableName & " DataTable" & vbCrLf
Dim col As DataColumn
For Each col In oTbl.Columns
strMsg &= col.ColumnName & " - " & col.DataType.ToString & vbCrLf
Next col
MessageBox.Show(strMsg)
Visual Basic.NET Pag. 38ADO.NET
De DataSet Rows Collection : alle geretourneerde rijen in
DataTable Index : ophalen van specifieke rij
Count : aantal rijen in dataTable
Doorlopen van de rijenFor each row in oDs.Tables(“Customers”)
....Next
DataRow Object : Gegevens van 1 rij in DataTable Via Geparametriseerde item property haal je waarde uit 1 veld op.
Voorbeeld 1 Dim strMsg As StringDim oTbl As DataTable = oDs.Tables("Customers")Dim row As DataRow = oTbl.Rows(0)strMsg = "CustomerID = " & row.("CustomerID") & vbCrLfstrMsg &= "CompanyNameID = " & row("CompanyName")MessageBox.Show(strMsg)
Visual Basic.NET Pag. 39ADO.NET
De DataSetVoorbeeld 2 : Tonen van de data in Listbox
– Doorlopen van rijen
Private Sub DisplayCustomersDim dr as DataRowFor each dr in oDS.Tables(“Customers”).Rows
lstCustomers.Items.Add(dr(“CustomerName”))Next
End Sub
– Of via binding
lstCustomers.DataSource = oDS.Tables(“Customers”)
lstCustomers.DisplayMember = “CustomerName” ‘opgepast hoofdlettergevoelig
lstCustomers.ValueMember = “CustomerID”
Visual Basic.NET Pag. 40ADO.NET
De DataSet• Aanpassen inhoud van DataSet (NOG NIET DE DB!!!)
Toevoegen van een nieuwe DataRowDim row As DataRow =oDS.Tables("Customers").NewRow
row("CustomerID") = "ALFKI"
...
oDS.Tables("Customers").Rows.Add(row)
Updaten van een DataRowDim rowCustomer As DataRow
rowCustomer = oDS.Tables("Customers").Rows.Find("ANTON")
If rowCustomer Is Nothing Then
'Customer not found!
Else rowCustomer.BeginEdit
rowCustomer("CompanyName") = "NewCompanyName“
rowCustomer("ContactName") = "NewContactName“
rowCustomer.EndEdit
End If
Visual Basic.NET Pag. 41ADO.NET
De DataSet
Verwijderen van een rijDim rowCustomer As DataRow
rowCustomer = oDS.Tables("Customers").Rows.Find("ALFKI")
oDS.Tables("Customers").Delete
Null waardenTesten of een kolom Null waarde bevat
Dim rowCustomer As DataRow rowCustomer = ds.Tables("Customers").Rows.Find("ALFKI") If IsDBNull(rowCustomer("Phone")) Then Console.WriteLine("It's
Null") ‘OfIf rowCustomer.IsNull(“Phone”) then ....
Instellen van een Null waardeDim rowCustomer As DataRow rowCustomer = ds.Tables("Customers").Rows.Find("ALFKI")rowCustomer("Phone") = DBNull.Value
Visual Basic.NET Pag. 42ADO.NET
De DataSet• Updaten van de DataSource
Via Command objecten
Via DataAdapter Generatie van update statements
– .NET genereert de update statements in functie van het SELECT statement dmv CommandBuilder
» Voorwaarde : Select statement moet primary key bevatten
» Werkt met optimistische locking
» Voorbeeld
Dim strConn As String = “Provider=Microsoft.Jet.OLEDB.4.0;...”
Dim oConn As New OleDbConnection(strConn)
Dim strSQl as String = “Select * from Customers”
Dim oDA = New oleDbDataAdapter(strSQl, oConn)
Dim oCB As New OleDbCommandBuilder(oDA)
– Je codeert zelf de Update statements (is performanter), nl InsertCommand, UpdateCommand en DeleteCommand
Submitten van de updates– oDA.Update(oDS, “Customers”) ‘dataset en source table
Visual Basic.NET Pag. 43ADO.NET
De DataSet
• Hoe gebeurt de update?
Elke rij bevat verschillende versies Original : bevat de aanvankelijk in de rij geladen gegevens
Default : bevat de standaardwaarden voor de rij (bepaald door de eigenschap DefaultValue van de kolommen). Als er geen defaultwaarden zijn gespecifieerd bevat deze versie dezelfde gegevens als de Original.
Current : bevat de bijgewerkte gegevens voor alle kolommen die zijn bijgewerkt en de gegevens uit de versie Original voor de kolommen die niet zijn bijgewerkt
Proposed : Nadat BeginEdit is aangeroepen voor een rij en voordat EndEdit opf CancelEdit worden aangeroepen. Als CancelEdit wordt aangeroepen , wordt de versie proposed verwijderd. EndEdit past de versie Proposed toe op de Current
Visual Basic.NET Pag. 44ADO.NET
De DataSet
Elke rij bevat een rijstatus. Property RowStateAdded : rij toegevoegd aan de tabel voordat AcceptChanges
wordt aangeroepen. Als AcceptChanges werd aangeroepen wordt rowstate ingeteld op Unchanged
Deleted : rij waarvoor methode Delete werd aangeroepen
Detached : een nieuwe rij die nog niet is toegevoegd aan de DataRowCollection (NewRow) of nog een rij die werd verwijderd uit een DataRowCollection (via Remove) maar nog niet werd gewist.
Modified : rij waarvan de gegevens werden verwijderd, maar waarvoor de methode AcceptChanges nog niet is aangeroepen
Unchanged : rij waarvoor de gegevens niet zijn gewijzigd sinds AcceptChanges voor het laatst werd aangeroepen.
Visual Basic.NET Pag. 45ADO.NET
De DataSet Met de versie en status van een DataRow bevat een DataSet
voldoende informatie om de gemaakte mutaties te laten persisteren in een database. De dataAdapter maakt gebruikt van de 3 Command objecten om voor een bepaalde DataRow de overeenkomstige operatie uit te voeren op db.
Stuur enkel de gewijzigde rijen naar de database– Dim gewijzigdeDs as DataSet– If ds.HasChanges then
» gewijzigdeDs = ds.GetChanges()» Dim oCB as New OleDbCommandBuilder(oDa)» Da.ContinueUpdateOnError = true» Da.Update(dswijzigingen,”Customers”)
Voeg originele dataset samen met de ververste wijzigingen– Ds.Merge(dsWijzigingen, true)
Controleer op errorsIf ds.HasErrorsDim row as DataRowFor each row in ds.GetErrors()
Console.writeline(“fout bij updaten “ & row.rowerror & “ voor “ & row(“customerid”) & “ “ & row(“companyname”,DataRowVersion.Current) & “ “ & row(“companyname”, DataRowVersion.Original”)
Next
Visual Basic.NET Pag. 46ADO.NET
DataSet
Je kan wijzigingen in gegevens in dataset accepteren of annuleren of opnieuw proberen te updaten.
Ds.RejectChanges Ds.AcceptChanges
Refreshen van data in de DataSet De dataTable moet een primary key bevatten
– Indien niet, zal de refresh de records die van de database komen acteraan toevoegen
– 2 manieren om primary key in te stellen» Set DataAdapter.MissingSchema = AddWithKey => Eenvoudig,
geen codering, PK komt van database» Manueel toevoegen aan DataTable => betere performantieBetter
performance Voer de DataAdapter.Fill terug uit
– De bestaande records zullen worden upgedate Als je de bestaande wijzigingen in je Dataset wenst te behouden
– Vull een nieuwe DataSet– Merge wijzigingen en zet PreserveChanges = true
Visual Basic.NET Pag. 47ADO.NET
De DataSet
Visual Basic.NET Pag. 48ADO.NET
De DataSet
• Demo + bespreking van de code
Visual Basic.NET Pag. 49ADO.NET
• Boeken en info
• http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/usingadonet.asp
Visual Basic.NET Pag. 50ADO.NET
Programming guidelines
• DataReader or DataSet
DataSet supports caching and serialization
DataReader has best performance
DataReader is use-once object
Comparable to SAX or DOM
• Managed provider to use
ODBC: for old ODBC drivers
OLE DB: for general OLEDB connections
SQL Server: for SQL Server only connections
Visual Basic.NET Pag. 51ADO.NET
De DataReader
Zoeken van waarden in een comboBoxPas Load event Form aan
Codeer de procedures SupplierLoad en CategoryLoad
Private Sub frmProduct_Load( ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Load Suppliers SupplierLoad() ' Load Categories CategoryLoad() ' Load List Box of Products ListLoad()End Sub
Visual Basic.NET Pag. 52ADO.NET
• En verder
Performantie opdrijven doorStored procedures
Zelf InsertCommand, UpdateCommand, DeleteCommand te creëeren en niet te werken met CommandBuilder
Typed DataSets (XML)
-> Maar dit behoort tot de leerstof van volgend jaar.
Visual Basic.NET Pag. 53ADO.NET
Visual Basic.NET Pag. 54ADO.NET
Uitvoeren van SQL instructie
• Voorbeeld 1 : SQL Tester
Maak nieuwe Windows Applicatie met naam SQLTester
Creëer form
Control Property ValueForm Name frmConnect
Text SQL TesterButton Name btnConnect
Text ConnectTextBox Name txtSQL
Multiline TRUELabel Name Label1
Text Rows AffectedTextBox Name txtRows
Text blankReadOnly TRUE
Button Name btnExecuteText Execute SQl
Visual Basic.NET Pag. 55ADO.NET
Uitvoeren van SQL instructie Dubbelklik Connect knop en schrijf volgende
code
Opm : sluit altijd de connectie af. Wacht niet tot object out of scope gaat. Close geeft de connectie terug aan de pool, zodat de connectie kan herbruikt worden door een andere procedure
Private Sub btnConnect_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
Dim oConn As OleDbConnection
Dim strConn As String
Try
oConn = New OleDbConnection()
strConn = “Provider=Microsoft.Jet.OLEDB.4.0;”
strConn &= “Data Source =“ & Application.StartUpPath & “\northwind.mdb”
oConn.ConnectionString = strConn
oConn.Open()
MessageBox.Show("Connection Open", "btnConnect_Click()")
oConn.Close() ‘close the connection
Catch oExcept As Exception
MessageBox.Show(oExcept.Message, "btnConnect_Click()")
End Try
End Sub
Visual Basic.NET Pag. 56ADO.NET
Uitvoeren van SQL instructie Dubbelklik Execute knop en schrijf volgende code
Private Sub btnExecute_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExecute.Click
Dim oCmd As OleDbCommand
Dim strConn As String
Try
strConn = “Provider=Microsoft.Jet.OLEDB.4.0;”
strConn &= “Data Source =“ & Application.StartUpPath & “\northwind.mdb”
oCmd = New OleDbCommand()
oCmd.Connection = New OleDbConnection(strConn)
oCmd.Connection.Open()
oCmd.CommandText = txtSQL.Text ' Assign the SQL to the Command Object
' Execute the SQL, Return Number of Records Affected
txtRows.Text = oCmd.ExecuteNonQuery().ToString()
MessageBox.Show("SQL statement succeeded", "btnExecute_Click()")
oCmd.Connection.Close()
Catch oExcept As Exception
txtRows.Text = 0.ToString()
MessageBox.Show("Error executing SQL: " & oExcept.Message, "btnExecute_Click()")
End Try
End Sub
Visual Basic.NET Pag. 57ADO.NET
Uitvoeren van SQL instructie
Opmerking : Maak een ConnectionStringBuild functie
Private Function ConnectStringBuild() As String
Dim strConn As String
strConn &= “Provider=Microsoft.Jet.OLEDB.4.0;”
strConn &= “Data Source =“ & Application.StartUpPath & “\northwind.mdb”
Return strConn
End Function
Visual Basic.NET Pag. 58ADO.NET
De DataReader
• Voorbeeld Product Information - revised DataReader kan je niet binden aan een listbox.
Hoe moet je op basis van de productnaam productgegevens terugvinden, indien productnaam niet uniek?
Oplossing : Maak een generische klasse ListItem
Klik Project > Add Class
Geef naam clsItemLists.vb
Geef code in
Gebruik die klasse in de listLoad procedure
Visual Basic.NET Pag. 59ADO.NET
Public Class clsItemList
Private mValue As String ‘bevat de text
Private mID As Integer ‘bevat de primaire sleutel
Public Sub New(ByVal strValue As String,ByVal intID As Integer)
mValue = strValue
mID = intID
End Sub
Property Value() As String
Get
Return mValue
End Get
Set(ByVal Value As String)
mValue = Value
End Set
End Property
Property ID() As Integer
Get
Return mID
End Get
Set(ByVal Value As Integer)
mID = Value
End Set
End Property Public Overrides Function ToString() As String ‘opgeroepen door listbox voor tonen van waarde object
Return mValue
End Function
End Class
Visual Basic.NET Pag. 60ADO.NET
Private Sub ListLoad()
Dim oCmd As OleDbCommand()
Dim oDr As OleDbDataReader
Dim oItem as clsItemList
Dim strSQL as String
Dim strConn as Strings= ConnectStringBuild()
strSQL = “Select ProductID, ProductName from Products order by ProductName”
Try
oCmd = new OleDbCommand()
With oCmd
.Connection = New OleDbConnection(strConn)
.Connection.Open()
.CommandText = strSQL
oDr = .ExecuteReader()
End With
lstProducts.Items.Clear()
Do while oDr.Read()
oItem = New clsItemList(oDr.Item(“ProductName”).ToString(), cint(oDR.Item(“ProductID”)),)
lstProducts.Items.Add(oItem)
Loop
If lstProducts.Items.Count > 0 then lstproducts.SetSelected(0,True)
Catch ex As OleDbException
MessageBox.Show(ex.Message)
End TryEnd Sub
Visual Basic.NET Pag. 61ADO.NET
De DataReader
Tonen van de Product Detail informatieDubbelklik lstProducts en voeg code toe
Voeg procedure ShowDetail toe– Opmerkingen
» Ctype : converteert van 1 data type naar een ander» Converteert een object type in een clsItemList type
Private Sub lstProducts_SelectedIndexChanged( _
ByVal sender As Object, ByVal e As System.EventArgs) _
Handles lstProducts.SelectedIndexChanged
ShowDetail()
End Sub
Visual Basic.NET Pag. 62ADO.NET
Private Sub ShowDetail()
Dim oCmd As OleDbCommand
Dim oDR As OleDbDataReader
Dim oItem As clsItemList
Dim strSQL As String
Dim strConn As String
strConn = ConnectStringBuild()
oItem = CType(lstProducts.SelectedItem, clsItemList) ' Get Primary Key From List Box
strSQL = "SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued "
strSQL &= " FROM Products "
strSQL &= " WHERE ProductID = " & oItem.ID
Try
oCmd = New OleDbCommand()
With oCmd
.Connection = New OleDbConnection(strConn)
.Connection.Open()
.CommandText = strSQL
oDR = .ExecuteReader()
End With
De DataReader
Visual Basic.NET Pag. 63ADO.NET
If oDR.Read() Then
With oDR
txtID.Text = .Item("ProductID").ToString()
txtName.Text =.Item("ProductName").ToString()
txtQty.Text = .Item("QuantityPerUnit").ToString()
txtPrice.Text = .Item("UnitPrice").ToString()
txtInStock.Text = .Item("UnitsInStock").ToString()
txtOnOrder.Text = .Item("UnitsOnOrder").ToString()
txtReorder.Text = .Item("ReorderLevel").ToString()
chkDisc.Checked = CType(.Item("Discontinued"), Boolean)
End With
End If
oDR.Close()
oCmd.Connection.Close()
Catch oException As Exception
MessageBox.Show(oException.Message)
End Try
End Sub
De DataReader
Visual Basic.NET Pag. 64ADO.NET
De DataReader
Vullen van de comboboxen Supplier en CategoryPas Load event Form aan
Codeer de procedures SupplierLoad en CategoryLoad
Private Sub frmProduct_Load( ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Load Suppliers SupplierLoad() ' Load Categories CategoryLoad() ' Load List Box of Products ListLoad()End Sub
Visual Basic.NET Pag. 65ADO.NET
De DataReader
Private Sub CategoryLoad()
Dim oCmd As OleDbCommand
Dim oDR As OleDbDataReader
Dim oItem As clsItemList
Dim strSQL As String
Dim strConn As String
strConn = ConnectStringBuild()
strSQL = "SELECT CategoryID, CategoryName FROM Categories"
Try
oCmd = New OleDbCommand()
With oCmd
.Connection = New OleDbConnection(strConn)
.Connection.Open()
.CommandText = strSQL
' Closes connection when closing DataReader object
oDR = .ExecuteReader(CommandBehavior.CloseConnection)
End With
Visual Basic.NET Pag. 66ADO.NET
De DataReader
Do While oDR.Read()
oItem = New clsItemList(oDR.Item("CategoryName").ToString(), CInt(oDR.Item("CategoryID")))
cboCategory.Items.Add(oItem)
Loop
oDR.Close()
' No need to close this because of the CloseConnection on the ExecuteReader
'oCmd.Connection.Close()
Catch oExcept As Exception
MessageBox.Show(oExcept.Message)
End Try
End Sub
Visual Basic.NET Pag. 67ADO.NET
De DataReader Updaten van een rij
Private Sub DataUpdate()
Dim oCmd As OleDbCommand
Dim strSQL As String
Dim intRows As Integer
strSQL = "UPDATE Products SET "
strSQL &= "ProductName = " & Str2Field(txtName.Text) & ", "
strSQL &= "SupplierID = " & CType(cboSupplier.Items(cboSupplier.SelectedIndex), clsItemList).ID & ", "
strSQL &= "CategoryID = " & CType(cboCategory.Items(cboCategory.SelectedIndex), clsItemList).ID & ", "
strSQL &= "QuantityPerUnit = " & Str2Field(cboSupplier.Text) & ", "
strSQL &= "UnitPrice = " & txtPrice.Text & ", "
strSQL &= "UnitsInStock = " & txtInStock.Text & ", "
strSQL &= "UnitsOnOrder = " & txtOnOrder.Text & ", "
strSQL &= "ReorderLevel = " & txtReorder.Text & ", "
strSQL &= "Discontinued = " & CType(IIf(chkDisc.Checked, "1", "0"), String)
strSQL &= " WHERE ProductID = " & CType(lstProducts.SelectedItem, clsItemList).ID
Visual Basic.NET Pag. 68ADO.NET
De DataReader
Try
oCmd = New OleDbCommand()
With oCmd
.Connection = New OleDbConnection(ConnectStringBuild())
.Connection.Open()
.CommandText = strSQL
intRows = .ExecuteNonQuery()
If intRows <> 1 Then MessageBox.Show("Did not insert row")
.Connection.Close()
End With
Catch oException As Exception
MessageBox.Show(oException.Message)
End Try
End Sub
Visual Basic.NET Pag. 69ADO.NET
De DataReader String velden moeten tussen ‘ staan
Private Function Str2Field(ByVal strValue As String) As String
If strValue.Trim() = "" Then
Return "Null"
Else
Return "'" & strValue.Trim() & "'"
End If
End Function
Visual Basic.NET Pag. 70ADO.NET
De DataReader Toevoegen van een rij
Private Sub DataInsert()
Dim oCmd As OleDbCommand
Dim strSQL As String
Dim intRows As Integer
strSQL = “INSERT INTO Products VALUES("
strSQL &= Str2Field(txtName.Text) & ", "
strSQL &= CType(cboSupplier.Items(cboSupplier.SelectedIndex), clsItemList).ID & ", "
strSQL &= CType(cboCategory.Items(cboCategory.SelectedIndex), clsItemList).ID & ", "
strSQL &= Str2Field(cboSupplier.Text) & ", "
strSQL &= txtPrice.Text & ", "
strSQL &= txtInStock.Text & ", "
strSQL &= txtOnOrder.Text & ", "
strSQL &= txtReorder.Text & ", "
strSQL &= CType(IIf(chkDisc.Checked, "1", "0"), String)
Visual Basic.NET Pag. 71ADO.NET
De DataReader Schrappen van een rij
Private Sub DataDelete()
Dim oCmd As OleDbCommand
Dim strSQL As String
Dim intRows As Integer
strSQL = “DELETE FROM Products "
strSQL &= " WHERE ProductID = " & CType(lstProducts.SelectedItem, clsItemList).ID
Visual Basic.NET Pag. 72ADO.NET
De DataSet
• Validatie van rijen in DataSet
Getypeerde dataset
Validatie Properties van de DataColumn ReadOnly : kolom kan niet gewijzigd worden
AllowDBNull : al dan niet verplicht in te vullen.
MaxLength : maximaal aantal characters
Unique : kolom mag al dan niet duplicate waarden bevatten. ADO.NET throwt een ConstraintException.
The DataTable Object's Constraints CollectionUniqueConstraints : kan je ook instellen via DataColumn
PrimaryKey
ForeignKeyConstraints : kan je ook instellen via Relations
Visual Basic.NET Pag. 73ADO.NET
De DataSet
Instellen van die properties (null, maxlength) viaoDA.MissingSchemaAction = MissingSchemaAction.AddWithKey
Visual Basic.NET Pag. 74ADO.NET
De DataSet
• Formatteren van velden in gebonden controls
De Add methode retourneert een Binding object dat reageert op CM object events en die data moved tussen textbox en kolom waarmee tekstbox gebonden is.
Binding object heeft 2 events : Format en ParseFormat event : bij laden van data in textbox
Parse event : bij schrijven data in dataSet
Visual Basic.NET Pag. 75ADO.NET
Handling Identity Columns
• Problem: Identity values are only generated upon insert
• Solution
Client values should not conflict with server valuesSet AutoIncrement Seed and Step to -1 on DataTable
When doing the insert in the DB, retrieve the new AutoIncrement valueModify the value in the inserted DataRow with the new one
In case of parent-child relationsInsert Parent rows before Child rows
Use UpdateRule.Cascade on DataRelation between Parent and Child
Visual Basic.NET Pag. 76ADO.NET
Handling Identity Columns
• Solution (continued)
How do you retrieve the new Identity value ?Do a “select scope_identity()” after insert statement
As an output parameter of a Insert Stored Procedure
How do you map the new Identity value to the DataRow?Set DataAdapter.SelectCommand.UpdateRowSource
– FirstReturnedRecord » maps fields of first returned record to inserted DataRow
– OutputParameter » maps output parameters of stored procedure to inserted
DataRow– Default is Both
Visual Basic.NET Pag. 77ADO.NET
Handling Identity Columns
• Problem: Identity values are only generated upon insert
• Easier Solution: make your primary key fields of the type UniqueIdentifier (GUID)
Can be generated in the clientNo need to fetch back inserted value
Easier to program with
Visual Basic.NET Pag. 78ADO.NET
Populating Multiple DataTables
• Retrieve multiple results in a single call
Execute Batch statement or stored procdure Map results to appropriate tables using tablemappings
• Use ExecuteXmlReader to retrieve hierarchical results Load with ReadXml using XmlReadMode.Fragment
• Submit updates in batches
Sample batch update example available soon…
Or save as DiffGram and send to SqlXml
Dim adapter As New SqlDataAdapter( _"SELECT * FROM customers; SELECT * FROM orders",cnn)
adapter.TableMappings.Add("Table1","Customer")adapter.TableMappings.Add("Table2","Orders")adapter.Fill(myDataSet)
Visual Basic.NET Pag. 79ADO.NET
Looking Up Values In The Dataset
• Searching for Results within a DataSet
DataTable.Find() for searching on PK values
DataView.Select() for repeated non-PK queries Sort DataView by search fields DataView builds an index for sorted columns
• Pass Table, filter, sort, RowState to constructor
Dim customer = customerTable.Rows.Find("GROSR")
Dim customerView As New DataView(customerTable)customerView.Sort = "State"Dim customers = customerView.FindRows("CA")
Dim view As New DataView( _customerTable, _"Country=USA", _"Region", _
DataViewRowState.CurrentRows )
Visual Basic.NET Pag. 80ADO.NET
Controlling How The XML Is Generated
• DataSet lets you control how XML is generated
• Name, Namespace properties on DataSet, DataTable, DataColumn
• MappingType property on DataColumn defines how data is written
Element, Attribute, SimpleType, Hidden
• Nested Property on DataRelation controls how children are written
' Write out CustomerID, OrderID as Attributesds.Tables("Customers").Columns("CustomerID").ColumnMapping = MappingType.Attributeds.Tables("Orders").Columns("OrderID").ColumnMapping = MappingType.Attribute
' Write out Orders as children of Customersds.Relations("cust_orders").Nested = True
<?xml version="1.0" standalone="yes"?><CustomerOrders> <Customers CustomerID="GROSR"> <ContactName>Manuel Pereira</ContactName> <Orders OrderID="10268"> <CustomerID>GROSR</CustomerID> <OrderDate>1996-07-30</OrderDate> </Orders> </Customers></CustomerOrders>