De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Visual Basic.NETPag.1 Addendum – ADO.NET ADO.NET : het object model.NET Data Providers Connecteren met een database : Connection Uitvoeren van SQL Query.

Verwante presentaties


Presentatie over: "Visual Basic.NETPag.1 Addendum – ADO.NET ADO.NET : het object model.NET Data Providers Connecteren met een database : Connection Uitvoeren van SQL Query."— Transcript van de presentatie:

1 Visual Basic.NETPag.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

2 ADO.NETVisual Basic.NETPag. 2 ADO.NET Het ADO.Net Object model

3 ADO.NETVisual Basic.NETPag. 3.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 project Imports System.Data.SqlClient Imports System.Data.OleDb Data Provider

4 ADO.NETVisual Basic.NETPag. 4 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 klasse SqlConnection in namespace System.Data.SQLClient OleDBConnection in namespace System.Data.OleDb Connection Object Data Provider

5 ADO.NETVisual Basic.NETPag. 5 Connecteren met een database Connecteren met een data source via OleDbConnection  Stel connection type in Dim 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 source oConn.Open()  Sluiten van verbinding If (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

6 ADO.NETVisual Basic.NETPag. 6 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

7 ADO.NETVisual Basic.NETPag. 7 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;

8 ADO.NETVisual Basic.NETPag. 8 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)

9 ADO.NETVisual Basic.NETPag. 9 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

10 ADO.NETVisual Basic.NETPag. 10 Connecteren met een database Connection Events StateChanged : als toestand van object Connection verandert –Geeft een StateChangeEventArgs door aan handler met 2 eigenschappen (mogelijke waarden idem property State) »CurrentState »OriginalState –Voorbeeld Dim theMessaqe as String theMessage = “The connection is changing from “ & _ e.OriginalState.ToString & “ to “ & _ e.CurrentState.ToString Messagebox.Show(theMessage)

11 ADO.NETVisual Basic.NETPag. 11 Connecteren met een database Opvangen van fouten Try 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

12 ADO.NETVisual Basic.NETPag. 12 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

13 ADO.NETVisual Basic.NETPag. 13 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.

14 ADO.NETVisual Basic.NETPag. 14 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 uitgevoerd oCmd.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)

15 ADO.NETVisual Basic.NETPag. 15 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

16 ADO.NETVisual Basic.NETPag. 16 Uitvoeren van SQL instructie Uitvoeren van Query of stored procedure  Via de Command methodes ExecuteNonQuery : 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'

17 ADO.NETVisual Basic.NETPag. 17 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()

18 ADO.NETVisual Basic.NETPag. 18 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"

19 ADO.NETVisual Basic.NETPag. 19 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()

20 ADO.NETVisual Basic.NETPag. 20 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 integer aantal=oCmd.executeScalar()

21 ADO.NETVisual Basic.NETPag. 21 Uitvoeren van SQL instructie Gebruik van parameters  3 stappen Parameters opgeven in de query Parameters opgeven in de verzameling Parameters Waarden aan parameters opgeven  Opgeven Query In OleDbCommand : ? oCmd.CommandText = “ Select * from customers where customerID = ?” In SqlDbCommand : benoemde parameters oCmd.CommandText= “Select * from customers where customerID  Toevoegen parameters aan verzameling Parameters oCmd.Parameters.Add(“CustomerID", OleDbType.WChar, 5)  Instellen Parameterwaarden oCmd.parameters(“CustomerID”).value =....

22 ADO.NETVisual Basic.NETPag. 22 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()

23 ADO.NETVisual Basic.NETPag. 23 Uitvoeren van SQL instructie Voorbeeld : Product Information  Maak nieuwe Windows Applicatie met naam Products  Creëer form  Codeer Load event van form Private Sub frmProduct_Load( ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ListLoad() End Sub  Codeer ListLoad procedure

24 ADO.NETVisual Basic.NETPag. 24 Uitvoeren van SQL instructie Private 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

25 ADO.NETVisual Basic.NETPag. 25 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.

26 ADO.NETVisual Basic.NETPag. 26 De DataReader Creatie DataReader Dim oDRAs OleDbDataReader.... oDR=oCmd.ExecuteReader() Doorlopen van DataReader Do 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

27 ADO.NETVisual Basic.NETPag. 27 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

28 ADO.NETVisual Basic.NETPag. 28 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

29 ADO.NETVisual Basic.NETPag. 29 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

30 ADO.NETVisual Basic.NETPag. 30 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 Try End Sub

31 ADO.NETVisual Basic.NETPag. 31 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

32 ADO.NETVisual Basic.NETPag. 32 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 DataAdapter Dim 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 Constructor Dim 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)

33 ADO.NETVisual Basic.NETPag. 33 De DataAdapter  Vullen van DataSet Dim oDs as New DataSet() oDA.MissingSchemaAction = MissingSchemaAction.AddWithKey oDa.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)

34 ADO.NETVisual Basic.NETPag. 34 De DataAdapter 2 SQL query XML Web Services XML 4 DataSet Results 3 Data Source 5 Updated XML DataSet 6 SQL updates Request data 1 Client

35 ADO.NETVisual Basic.NETPag. 35 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 Object Collection Relations Relation Rows Row

36 ADO.NETVisual Basic.NETPag. 36 De DataSet  Tables : collectie van table objecten  Table : een tabel bestaande uit kolommen, rijen en constraints Je kan meerdere tabellen in 1 dataset laden Dim 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)

37 ADO.NETVisual Basic.NETPag. 37 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)

38 ADO.NETVisual Basic.NETPag. 38 De DataSet  Rows Collection : alle geretourneerde rijen in DataTable Index : ophalen van specifieke rij Count : aantal rijen in dataTable Doorlopen van de rijen For 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 String Dim oTbl As DataTable = oDs.Tables("Customers") Dim row As DataRow = oTbl.Rows(0) strMsg = "CustomerID = " & row.("CustomerID") & vbCrLf strMsg &= "CompanyNameID = " & row("CompanyName") MessageBox.Show(strMsg)

39 ADO.NETVisual Basic.NETPag. 39 De DataSet Voorbeeld 2 : Tonen van de data in Listbox –Doorlopen van rijen Private Sub DisplayCustomers Dim dr as DataRow For 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”

40 ADO.NETVisual Basic.NETPag. 40 De DataSet Aanpassen inhoud van DataSet (NOG NIET DE DB!!!)  Toevoegen van een nieuwe DataRow Dim row As DataRow =oDS.Tables("Customers").NewRow row("CustomerID") = "ALFKI"... oDS.Tables("Customers").Rows.Add(row)  Updaten van een DataRow Dim 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

41 ADO.NETVisual Basic.NETPag. 41 De DataSet  Verwijderen van een rij Dim rowCustomer As DataRow rowCustomer = oDS.Tables("Customers").Rows.Find("ALFKI") oDS.Tables("Customers").Delete  Null waarden Testen 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") ‘Of If rowCustomer.IsNull(“Phone”) then.... Instellen van een Null waarde Dim rowCustomer As DataRow rowCustomer = ds.Tables("Customers").Rows.Find("ALFKI") rowCustomer("Phone") = DBNull.Value

42 ADO.NETVisual Basic.NETPag. 42 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

43 ADO.NETVisual Basic.NETPag. 43 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

44 ADO.NETVisual Basic.NETPag. 44 De DataSet  Elke rij bevat een rijstatus. Property RowState Added : 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.

45 ADO.NETVisual Basic.NETPag. 45 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 errors If ds.HasErrors Dim row as DataRow For each row in ds.GetErrors() Console.writeline(“fout bij updaten “ & row.rowerror & “ voor “ & row(“customerid”) & “ “ & row(“companyname”,DataRowVersion.Current) & “ “ & row(“companyname”, DataRowVersion.Original”) Next

46 ADO.NETVisual Basic.NETPag. 46 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

47 ADO.NETVisual Basic.NETPag. 47 De DataSet

48 ADO.NETVisual Basic.NETPag. 48 De DataSet Demo + bespreking van de code

49 ADO.NETVisual Basic.NETPag. 49 Boeken en info en-us/dndotnet/html/usingadonet.asp

50 ADO.NETVisual Basic.NETPag. 50 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

51 ADO.NETVisual Basic.NETPag. 51 De DataReader  Zoeken van waarden in een comboBox Pas 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

52 ADO.NETVisual Basic.NETPag. 52 En verder  Performantie opdrijven door Stored 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.

53 ADO.NETVisual Basic.NETPag. 53

54 ADO.NETVisual Basic.NETPag. 54 Uitvoeren van SQL instructie Voorbeeld 1 : SQL Tester  Maak nieuwe Windows Applicatie met naam SQLTester  Creëer form

55 ADO.NETVisual Basic.NETPag. 55 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

56 ADO.NETVisual Basic.NETPag. 56 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

57 ADO.NETVisual Basic.NETPag. 57 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

58 ADO.NETVisual Basic.NETPag. 58 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

59 ADO.NETVisual Basic.NETPag. 59 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

60 ADO.NETVisual Basic.NETPag. 60 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 Try End Sub

61 ADO.NETVisual Basic.NETPag. 61 De DataReader  Tonen van de Product Detail informatie Dubbelklik 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

62 ADO.NETVisual Basic.NETPag. 62 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

63 ADO.NETVisual Basic.NETPag. 63 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

64 ADO.NETVisual Basic.NETPag. 64 De DataReader  Vullen van de comboboxen Supplier en Category Pas 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

65 ADO.NETVisual Basic.NETPag. 65 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

66 ADO.NETVisual Basic.NETPag. 66 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

67 ADO.NETVisual Basic.NETPag. 67 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

68 ADO.NETVisual Basic.NETPag. 68 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

69 ADO.NETVisual Basic.NETPag. 69 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

70 ADO.NETVisual Basic.NETPag. 70 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)

71 ADO.NETVisual Basic.NETPag. 71 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

72 ADO.NETVisual Basic.NETPag. 72 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 Collection UniqueConstraints : kan je ook instellen via DataColumn PrimaryKey ForeignKeyConstraints : kan je ook instellen via Relations

73 ADO.NETVisual Basic.NETPag. 73 De DataSet  Instellen van die properties (null, maxlength) via oDA.MissingSchemaAction = MissingSchemaAction.AddWithKey

74 ADO.NETVisual Basic.NETPag. 74 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 Parse Format event : bij laden van data in textbox Parse event : bij schrijven data in dataSet

75 ADO.NETVisual Basic.NETPag. 75 Handling Identity Columns Problem: Identity values are only generated upon insert Solution  Client values should not conflict with server values Set AutoIncrement Seed and Step to -1 on DataTable  When doing the insert in the DB, retrieve the new AutoIncrement value Modify the value in the inserted DataRow with the new one  In case of parent-child relations Insert Parent rows before Child rows Use UpdateRule.Cascade on DataRelation between Parent and Child

76 ADO.NETVisual Basic.NETPag. 76 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

77 ADO.NETVisual Basic.NETPag. 77 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 client No need to fetch back inserted value Easier to program with

78 ADO.NETVisual Basic.NETPag. 78 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)

79 ADO.NETVisual Basic.NETPag. 79 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 )

80 ADO.NETVisual Basic.NETPag. 80 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 Attributes ds.Tables("Customers").Columns("CustomerID").ColumnMapping = MappingType.Attribute ds.Tables("Orders").Columns("OrderID").ColumnMapping = MappingType.Attribute ' Write out Orders as children of Customers ds.Relations("cust_orders").Nested = True Manuel Pereira GROSR


Download ppt "Visual Basic.NETPag.1 Addendum – ADO.NET ADO.NET : het object model.NET Data Providers Connecteren met een database : Connection Uitvoeren van SQL Query."

Verwante presentaties


Ads door Google