addendum – ado.net

80
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

Upload: happy

Post on 14-Jan-2016

83 views

Category:

Documents


2 download

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 Presentation

TRANSCRIPT

Page 1: Addendum – ADO.NET

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

Page 2: Addendum – ADO.NET

Visual Basic.NET Pag. 2ADO.NET

ADO.NET

• Het ADO.Net Object model

Page 3: Addendum – ADO.NET

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

Page 4: Addendum – ADO.NET

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

Page 5: Addendum – ADO.NET

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

Page 6: Addendum – ADO.NET

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

Page 7: Addendum – ADO.NET

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;

Page 8: Addendum – ADO.NET

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)

Page 9: Addendum – ADO.NET

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

Page 10: Addendum – ADO.NET

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)

Page 11: Addendum – ADO.NET

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

Page 12: Addendum – ADO.NET

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

Page 13: Addendum – ADO.NET

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.

Page 14: Addendum – ADO.NET

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)

Page 15: Addendum – ADO.NET

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

Page 16: Addendum – ADO.NET

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'

Page 17: Addendum – ADO.NET

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()

Page 18: Addendum – ADO.NET

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"

Page 19: Addendum – ADO.NET

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()

Page 20: Addendum – ADO.NET

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()

Page 21: Addendum – ADO.NET

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

Page 22: Addendum – ADO.NET

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()

Page 23: Addendum – ADO.NET

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

Page 24: Addendum – ADO.NET

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

Page 25: Addendum – ADO.NET

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.

Page 26: Addendum – ADO.NET

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

Page 27: Addendum – ADO.NET

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

Page 28: Addendum – ADO.NET

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

Page 29: Addendum – ADO.NET

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

Page 30: Addendum – ADO.NET

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

Page 31: Addendum – ADO.NET

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

Page 32: Addendum – ADO.NET

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)

Page 33: Addendum – ADO.NET

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)

Page 34: Addendum – ADO.NET

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

Page 35: Addendum – ADO.NET

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

Page 36: Addendum – ADO.NET

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)

Page 37: Addendum – ADO.NET

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)

Page 38: Addendum – ADO.NET

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)

Page 39: Addendum – ADO.NET

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”

Page 40: Addendum – ADO.NET

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

Page 41: Addendum – ADO.NET

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

Page 42: Addendum – ADO.NET

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

Page 43: Addendum – ADO.NET

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

Page 44: Addendum – ADO.NET

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.

Page 45: Addendum – ADO.NET

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

Page 46: Addendum – ADO.NET

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

Page 47: Addendum – ADO.NET

Visual Basic.NET Pag. 47ADO.NET

De DataSet

Page 48: Addendum – ADO.NET

Visual Basic.NET Pag. 48ADO.NET

De DataSet

• Demo + bespreking van de code

Page 49: Addendum – ADO.NET

Visual Basic.NET Pag. 49ADO.NET

• Boeken en info

• http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/usingadonet.asp

Page 50: Addendum – ADO.NET

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

Page 51: Addendum – ADO.NET

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

Page 52: Addendum – ADO.NET

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.

Page 53: Addendum – ADO.NET

Visual Basic.NET Pag. 53ADO.NET

Page 54: Addendum – ADO.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

Page 55: Addendum – ADO.NET

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

Page 56: Addendum – ADO.NET

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

Page 57: Addendum – ADO.NET

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

Page 58: Addendum – ADO.NET

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

Page 59: Addendum – ADO.NET

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

Page 60: Addendum – ADO.NET

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

Page 61: Addendum – ADO.NET

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

Page 62: Addendum – ADO.NET

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

Page 63: Addendum – ADO.NET

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

Page 64: Addendum – ADO.NET

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

Page 65: Addendum – ADO.NET

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

Page 66: Addendum – ADO.NET

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

Page 67: Addendum – ADO.NET

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

Page 68: Addendum – ADO.NET

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

Page 69: Addendum – ADO.NET

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

Page 70: Addendum – ADO.NET

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)

Page 71: Addendum – ADO.NET

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

Page 72: Addendum – ADO.NET

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

Page 73: Addendum – ADO.NET

Visual Basic.NET Pag. 73ADO.NET

De DataSet

Instellen van die properties (null, maxlength) viaoDA.MissingSchemaAction = MissingSchemaAction.AddWithKey

Page 74: Addendum – ADO.NET

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

Page 75: Addendum – ADO.NET

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

Page 76: Addendum – ADO.NET

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

Page 77: Addendum – ADO.NET

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

Page 78: Addendum – ADO.NET

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)

Page 79: Addendum – ADO.NET

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 )

Page 80: Addendum – ADO.NET

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>