Programmeren in ASP.NET/Databankgegevens wijzigen
SQL-opdrachten uitvoeren
bewerkenSQL-opdrachten die gegevens wijzigen (zoals INSERT INTO, UPDATE of DELETE) geven geen resultaten terug zoals SELECT. De manier om deze opdrachten te gebruiken is dus verschillend. Gebruik hiervoor het OleDbCommand-object, en roep hiervan de ExecuteNonQuery()-methode aan.
Gegevens toevoegen
bewerkenDeze code voert een "INSERT INTO" opdracht uit:
ASP.NET-code: "INSERT INTO"
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.mdb" Dim cn As new OleDbConnection(strConn) Dim strSQL As String="INSERT INTO AdresTabel (Naam,Voornaam) VALUES ('Smet','Jan');" Dim cm As New OleDbCommand(strSQL, cn) Try cn.Open() cm.ExecuteNonQuery() 'Naam werd toegevoegd Catch ex As Exception Trace.Warn(ex.Message) Finally cn.Close() End Try
Opmerkingen:
- Als je bij een Access-databank de foutmelding "Operation must use an updateable query" krijgt, dan betekent dit dat de gebruiker ASPNET (Windows 2000, XP) of NETWORK SERVICE (Windows 2003) op de server niet voldoende rechten bezit op het Access-bestand. Deze gebruiker moet het recht hebben om het Access-bestand te wijzigen.
- In SQL Server moet de gebruiker het INSERT-recht hebben voor de tabel in kwestie.
- De methode ExecuteNonQuery() geeft als return-waarde een Integer terug met het aantal records dat aangepast werd. Je kan die waarde gebruiken om te testen of het bijwerken gelukt is:
Dim aantal As Integer = cm.ExecuteNonQuery() If(aantal>0) Then ' het is gelukt
Parameters gebruiken bij het bijwerken
bewerkenIn de bovenstaande code zal je meestal de naam en de voornaam niet op voorhand kennen. Deze gegevens komen bijvoorbeeld uit een formulier dat de gebruiker ingevuld heeft.
Je moet hier dus weer met parameters werken in het Command-object.
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.mdb" Dim cn As new OleDbConnection(strConn) Dim strSQL As String = _ "INSERT INTO AdresTabel (Naam, Voornaam) VALUES (@Naam,@Voornaam);" Try cn.Open() Dim cm As New OleDbCommand(strSQL, cn) cm.Parameters.AddWithValue("@Naam",Naamvak.Text) cm.Parameters.AddWithValue("@Voornaam",Voornaamvak.Text) cm.ExecuteNonQuery() 'Naam werd toegevoegd" Catch ex As Exception Trace.Warn(ex.Message) Finally cn.Close() End Try
Opmerkingen:
- In de SQL-streng vervang je de variabelen (de parameters) door woorden die beginnen met een apenstaart:
INSERT INTO AdresTabel (Naam, Voornaam) VALUES (@Naam,@Voornaam);"
- Je voegt de echte waarden van de parameters toe met de opdrachten:
cm.Parameters.AddWithValue("@Naam",Naamvak.Text) cm.Parameters.AddWithValue("@Voornaam",Voornaamvak.Text)
- Let goed op: in OleDb moeten de parameters toegevoegd worden in dezelfde volgorde waarin ze in de SQL-streng voorkomen, dus eerst de naam, dan de voornaam. Zelfs als je duidelijk dezelfde aanduiding @Naam gebruikt, zal dit geen enkel effect hebben. Deze aanduiding wordt gewoon genegeerd, het is alleen de volgorde die telt. De aanduiding heeft alleen nut voor jou als programmeur om het iets overzichtelijker te maken.
- Natuurlijk moeten er ook evenveel parameters toegevoegd worden als er vraagtekens zijn. Anders krijg je de foutmelding: "No value given for one or more required parameters".
- Zorg ervoor dat de waarde van een parameter nooit Nothing kan zijn. Anders krijg je de foutmelding: "Parameter @x has no default value".
Oefeningen
bewerken- Maak een formulier "invoer.htm" om adressen in te voeren. Stuur de gegevens naar een tweede pagina "verwerk.aspx". Voeg het ingevoerde adres toe aan de databank. Merk op dat het formulier zelf geen ASP-code bevat (alleen HTML).
- Zelfde oefening, maar zet nu het formulier en de verwerking in één enkele (aspx-)pagina.
- Maak een formulier om verjaardagen toe te voegen aan een databank met een "verjaarkalender".
- Schrijf een script dat alle records van een tabel in Access kopieert naar een gelijkaardige tabel in SQL Server.
Gegevens bijwerken
bewerkenDe code hieronder voert een "UPDATE"-opdracht uit. Merk op dat je ook hier voor de WHERE-clause een parameter gebruikt.
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.mdb" Dim cn As new OleDbConnection(strConn) Dim strSQL As String="UPDATE AdresTabel Set Naam=@Naam WHERE ID=@ID;" Dim cm As New OleDbCommand(strSQL, cn) cm.Parameters.AddWithValue("@Naam",strNieuweNaam) cm.Parameters.AddWithValue("@ID",id) Try cn.Open() cm.ExecuteNonQuery() 'Naam werd bijgewerkt Catch ex As Exception Trace.Warn(ex.Message) Finally cn.Close() End Try
Bij een UPDATE-commando kan het gebeuren dat je geen foutmelding krijgt, maar dat er toch niets bijgewerkt wordt. Meestal komt dit doordat de WHERE-conditie verkeerd geschreven is, zodat er geen enkel record aan voldoet.
Gegevens verwijderen
bewerkenDe code voert een "DELETE" opdracht uit. Je gebruikt een parameter om op te geven welk record je wil verwijderen.
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.mdb" Dim cn As new OleDbConnection(strConn) Dim strSQL As String="DELETE FROM AdresTabel WHERE ID=@ID;" Dim cm As New OleDbCommand(strSQL, cn) cm.Parameters.AddWithValue("@ID",id) ' id is de ID van het record dat weg moet Try cn.Open() cm.ExecuteNonQuery() 'record werd verwijderd Catch ex As Exception Trace.Warn(ex.Message) Finally cn.Close() End Try
Oefening
bewerken- Breid de toepassing met de wachtwoorden-databank uit, zodat een gebruiker ook zijn of haar wachtwoord kan wijzigen
Opgeslagen procedures uitvoeren
bewerkenOpgeslagen procedures of stored procedures (bijvoorbeeld in SQL Server) kan je uitvoeren net alsof je een query uitvoert. Je moet alleen de CommandType-property van het SqlCommand-object instellen op StoredProcecure:
Dim strConn As String = "Server=(local);trusted_connection=true;Database=Adressen" Dim cn As New SqlConnection(strConn) Try cn.Open() Dim strSQL As String = "sp_MijnStoredProcedure" Dim cm As New SqlCommand(strSQL, cn) cm.CommandType = CommandType.StoredProcedure cm.ExecuteNonQuery() 'procedure werd uitgevoerd Catch ex As Exception Trace.Warn(ex.Message) Finally cn.Close() End Try
Je kan ook parameters toevoegen, net zoals bij een gewone query.