10. ASP og SQL Innledning Recordset-objektet. Innhold. Referanse til læreboka Kapittel Se detaljer nedenfor.

Like dokumenter
9. ASP med databasekopling, del II

8. ASP med databasekopling, del I

12. Et større ASP-eksempel Innledning Beskrivelse av nett-butikken. Innhold

HØGSKOLEN I SØR-TRØNDELAG

Datamodellering og databaser SQL, del 2

Datamodellering og databaser SQL, del 2

Datamodellering og databaser SQL, del 2

1. SQL datadefinisjon og manipulering

1. Innføring i bruk av MySQL Query Browser

Oppgave 1 (Opprett en database og en tabell)

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

HØGSKOLEN I SØR-TRØNDELAG

Videregående programmering 6

Tilkobling og Triggere

HØGSKOLEN I SØR-TRØNDELAG

Oppgaver Oppgave a: Sett opp mulige relasjoner

Å bruke Java API-et til å sortere tabeller/arraylister der elementene er (referanser til) objekter

Kom i gang med emedia

Prosedyrer. Lars Vidar Magnusson. October 26, Lars Vidar Magnusson () Forelesning i DAS October 26, / 19

1. Relasjonsmodellen Kommentarer til læreboka

Det du skal gjøre i denne oppgava er først å sette opp bakgrunnen til spillet og så rett og slett å få firkanter til å falle over skjermen.

Databaser kort intro. Tom Heine Nätt

SQL 3: Opprette tabeller, datainnsetting og utsnitt

Sikkerhet og tilgangskontroll i RDBMS-er

Tetris. Introduksjon. Skrevet av: Kine Gjerstad Eide. Lag starten på ditt eget tetris spill!

ORDBMS og OODBMS i praksis

En lett innføring i foreninger (JOINs) i SQL

HØGSKOLEN I SØR-TRØNDELAG

Transaksjonshåndtering. Skalerbarhet.

Innføring i bruk av CGI4VB

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG

Steg 1: Lag bildedeklarasjon

Metaspråket for å beskrive grammatikk

Innføring i bruk av CGI4VB

Bygg et Hus. Steg 1: Prøv selv først. Sjekkliste. Introduksjon. Prøv selv

>>12 Arbeide med MySQL

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

En enkel innføring i ASP

Vanlige spørsmål om EndNote (april 2013)

Scan Secure GTS PAS

Bygg et Hus. Introduksjon. Steg 1: Prøv selv først. Skrevet av: Geir Arne Hjelle

Hva er Derby og Java DB? Denne forelesningen. Java Database Connectivity (JDBC) Hva er Derby og Java DB?

Flytte Lønn 5.0 fra SQL 2000 til SQL 2005 / 2008

Bruke SQL fra Python. Med Psycopg2

Klasser skal lages slik at de i minst mulig grad er avhengig av at klienten gjør bestemte ting STOL ALDRI PÅ KLIENTEN!

Lønn 5.0. Veiledning for ASP leverandører

>>21 Datamodellering i MySQL Workbench

Databaser: Relasjonsmodellen, del I

SQL: Datatyper m.m. Evgenij Thorstensen V18. Evgenij Thorstensen SQL: Datatyper m.m. V18 1 / 12

EKSAMEN 6102 / 6102N DATABASER

Java Database Connectivity (JDBC) Norvald H. Ryeng

Integritetsregler i SQL. Primærnøkler

HØGSKOLEN I SØR-TRØNDELAG

Verden. Steg 1: Vinduet. Introduksjon

Controller Brukerstøttedatabase Ottar Holstad/Cantor 09.

DATAUTFORSKNING I EG, EG 7.1 OG EGENDEFINERTE FUNKSJONER SAS FANS I STAVANGER 4. MARS 2014, MARIT FISKAAEN

Miniverden og ER- modell

Når en bruker skriver sitt navn ("Ole") i et form-element med name="fornavn" som attributt. klikker på submit-knappen

$antall_maaneder =12; Variablene $pris og $antall_maaneder i eksemplet ovenfor har

Transaksjoner og flerbrukerproblematikk. Transaksjoner

HØGSKOLEN I SØR-TRØNDELAG

For kunder som kjører Huldt & Lillevik Reise 1.3 på Access database

SQL Server guide til e-lector

Huldt & Lillevik Lønn og Personal - System 4. Oppdatering. Aditro HRM AS

Oblig 4Hybelhus litt mer tips enn i oppgaven

HØGSKOLEN I SØR-TRØNDELAG

Integritetsregler i SQL

lage og bruke funksjoner som tar argumenter lage og bruke funksjoner med returverdier forklare forskjellen mellom globale og lokale variabler

EKSAMEN DATABASER

Verden. Introduksjon. Skrevet av: Kine Gjerstad Eide og Ruben Gjerstad Eide

Vanlige spørsmål om EndNote (mars 2015)

JDBC. Java DataBase Connectivity SQL i Java Læreboken: 8.5, s Forelesning i TDT4145, 9. mars 2004 Av Gisle Grimen

VMware Horizon View Client. Brukerveiledning for nedlasting, installasjon og pålogging for fjerntilgang

Konfigurasjon av nettverksløsning for Eldata 8.0 basert på PostgreSQL databasesystem.

1. Normalisering Kommentarer til læreboka

Bruk av NetBeans i JSP-delen av Web-applikasjoner med JSP og JSF

Argumenter fra kommandolinjen

som blanker skjermen (clear screen). Du får en oversikt over alle kommandoene ved å skrive,

2. Beskrivelse av installasjon av SQL Server 2005 og hvordan lage databasen som trengs av administrasjonsprogrammet:

Kom i gang med Zotero: En enkel veiledning

DBMS Database Management System (repetisjon) Programmeringsgrensesnitt. Serialiserbarhet

ToPlayer. Introduksjon: Skrevet av: Ruben Gjerstad Eide og Kine Gjerstad Eide

ToPlayer. Steg 1: Kom i gang med metodene setup og draw. Gjør dette: Introduksjon:

En enkel while-løkke. 1 of :28. 2 of :28. while-løkker gjentar instruksjonene så lenge en betingelse er oppfylt

Kursdeltakere som ønsker å bruke leksjonene f.eks til undervisning eller kursformål må ta direkte kontakt med forfatter for nærmere avtale.

Transaksjoner og flerbrukerproblematikk. Transaksjoner

NY PÅ NETT. Enkel tekstbehandling

Inf109 Programmering for realister Uke 5. I denne leksjonen skal vi se på hvordan vi kan lage våre egne vinduer og hvordan vi bruker disse.

SQL: Systemaspekter. Evgenij Thorstensen V18. Evgenij Thorstensen SQL: Systemaspekter V18 1 / 21

HØGSKOLEN I SØR-TRØNDELAG

JavaScriptbibliotek. Introduksjon MVVC. Informasjonsteknologi 2. Gløer Olav Langslet Sandvika VGS

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Huldt & Lillevik Lønn og Personal - System 4. Oppdatering. Personec AS. Veiledningen er oppdatert pr

Høgskolen i Telemark EKSAMEN 6102 DATABASER Tid: Hjelpemidler: Vedlegg: Eksempeldata til oppgave 1

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

Brukerdokumentasjon. Webservices og webklient for kodeverk/ kodeverdi verifisering

Bruk av kildeavskrifter som er merket med grønn kule

Transkript:

Else Lervik 29.03.2004 Opphavsrett: Forfatter og Stiftelsen TISIP Lærestoffet er utviklet for faget LV192D Web-programmering med ASP 10. Resymé: Vi begynner med å inspisere Recordset-objektet. Deretter ser vi hvordan vi kan kjøre SQL-setninger i Access, og hvordan vi bruker Exceute()-funksjonen til å kjøre SQL-setninger i ASP. Innhold 10.1. INNLEDNING... 1 10.2. RECORDSET-OBJEKTET... 1 10.2.1. Å inspisere Recordset-objektet... 1 10.2.2. Databasekursorer... 4 10.3. Å KJØRE SQL-SETNINGER I ACCESS... 5 10.4. SQL OG DE FIRE DATABASEOPERASJONENE... 7 10.5. CONNECTION.EXECUTE()... 9 Referanse til læreboka Kapittel 18-20. Se detaljer nedenfor. 10.1. Innledning Dette er tredje database-leksjon. Hovedtemaet er nok en gang Recordset-objektet. Kapittel 18 i boka gjennomgår mange detaljer om dette. Vi tar for oss de viktigste i denne leksjonen. I leksjon 8 ble du så vidt kjent med SQL, og vi så også hvordan vi kan bruke SQL i ASP. Vi skal gå mer i dybden på dette i denne leksjonen, og også se på ulike typer SQL-setninger. (Du vil fremdeles få oppgitt syntaksen til alle SQL-setninger du trenger å bruke.) Vi skal også ta med litt fra kapittel 20, om bruk av kursorer i et recordsett. 10.2. Recordset-objektet Dette er sentralt når vi skal jobbe med databaser i ASP. Det viser et speilbilde av de dataene som ligger i databasen. Det lar oss forholde oss til dataene på tabellform. 10.2.1. Å inspisere Recordset-objektet Se også side 558-571 i boka.

Recordset-objektet inneholder ikke bare dataene, men også informasjon om datastrukturen. (Hvordan skulle det ellers vite hva vi mener når vi skriver for eksempel objresultat( fornavn )?) Objektet vet hva kolonnene heter, samt størrelse og datatype til disse. Hver rad i recordsettet har sin egen Fields-samling. Hvert objekt i denne samlingen har en mengde egenskaper, se tabellen side 565. Vi har hittil kun brukt Value-egenskapen. Når vi skriver objresultat( fornavn ) er det det samme som om vi hadde skrevet objresultat.fields("fornavn").value. Figur 1: En vilkårlig SQL select-setning mot en vilkårlig database Figur 1 viser resultatet fra en SQL-setning mot Gastronor-databasen. Dette er en database som følger med Access, hos meg ligger den lagret på C:\Program Files\Microsoft Office\Samples\Gastronor.mdb. Hvis du vil prøve den, må du først sette opp ODBC-systemdatakildeforbindelse. Dersom den allerede har definert en Brukerdatakilde-forbindelse må du slette den først. Mulig du også i tilfelle må restarte maskinen. ASP en over er nyttig når du skal prøve ut ulike SQL-setninger. Du skriver en ODBCdatabase og en SQL-setning. I eksemplet i figuren er SQL-setningen lenger enn det feltet den skrives i, det gjør imidlertid ikke noe, feltet kan rulles. Etter å ha skrevet inn setningen, trykker du på knappen og resultatet kommer opp. Det er relativt enkelt å lage denne ASP en ved å gjøre bruk av det vi nettopp har gjennomgått om Recordset-objektet: <% ' ' VisSelectResultat.asp 2001-10-20 ' Option Explicit %> <!-- #include virtual = "/adovbs.inc" --> side 2 av 9

<HTML><HEAD><TITLE>Personer</TITLE></HEAD> <BODY BGCOLOR="wheat" TEXT="darkgreen" LINK="brown" VLINK="steelblue" ALINK="darkblue"> <H1>Resultat av SQL SELECT-setning</H1> <% Dim strsqlsetning, strdatabasenavn strsqlsetning = Request.Form("sqlSetning") strdatabasenavn = Request.Form("database") %> <FORM ACTION="VisSelectResultat.asp" METHOD="post"> <P><TABLE> <TR><TD>Databasenavn (ODBC): </TD> <TD><INPUT TYPE="text" NAME="database" SIZE=70 VALUE="<%=strDatabasenavn%>"></TD></TR> <TR><TD>Setning: </TD> <TD><INPUT TYPE="text" NAME="sqlSetning" SIZE=70 VALUE="<%=strSqlSetning%>"></TD> </TR> </TABLE> <P><INPUT TYPE="submit" NAME="soek" VALUE="Vis resultatet av denne setningen!"> <% Dim objdbforbindelse, objresultat If strsqlsetning <> "" Then ' Oppretter forbindelse til databasen Set objdbforbindelse = Server.CreateObject("ADODB.Connection") objdbforbindelse.open ("dsn=" & strdatabasenavn) 'Utfører SQL-setningen. Resultatet lagres i "recordsettet" objresultat Set objresultat = Server.CreateObject("ADODB.Recordset") objresultat.open strsqlsetning, objdbforbindelse,,, adcmdtext %> <P>Setning: <%=strsqlsetning%> <P> <TABLE BORDER=1> <TR> <%Dim objkolonne Response.Write("<TR>") For Each objkolonne in objresultat.fields Response.Write("<TH>" & objkolonne.name & "</TH>") Next Response.Write("</TR>") Do While Not objresultat.eof Response.Write("<TR>") For Each objkolonne in objresultat.fields Response.Write("<TD>" & objkolonne.value & "</TD>") Next Response.Write("</TR>") objresultat.movenext() Loop objresultat.close() objdbforbindelse.close() Set objresultat = Nothing Set objdbforbindelse = Nothing End If %> </TABLE> </FORM> </BODY></HTML> side 3 av 9

Vi gjennomløper Fields-samlingen ved å bruke For Each Next. Først finner vi kolonnenavnene (egenskapen Name), deretter går vi gjennom hver enkelt rad og finner verdiene (egenskapen Value). 10.2.2. Databasekursorer Kursortype angis når du åpner et recordsett. Parametrene til Open-metoden finner du på side 516. Boka skriver om kursorer på sidene 571-573 og på sidene 627-634. Du kjenner til den interne pekeren som brukes når vi gjennomløper et recordsett. Denne pekeren kalles også ofte, på dårlig norsk, for kursor. Engelsk: database cursor eller bare cursor. Vi kan bruke forskjellige typer kursorer i recordsettet vårt. Vi angir dette som tredje parameter i Open-kallet, eksempel: objresultat.open strtabellnavn, objdbforbindelse, adopendynamic adopendynamic og de andre kursortypene er heltallskonstanter som er deklarert i den etter hvert forhåpentligvis velkjente filen adovbs.inc. Typen kursor bestemmer hvorvidt vi kan flytte oss både framover og bakover i recordsettet, og den bestemmer også hvor ofte programmet vårt skal hente friske data fra databasen. Det siste har betydning for i hvilken grad oppdateringer som andre gjør vil vises hos oss. Dersom vi ikke oppgir kursortype, er det adopenforwardonly som gjelder. Denne medfører at data hentes fra databasen kun en gang, og det er når recordsettet åpnes. Endringer vi gjør vil registreres i databasen når vi utfører Update() på recordsettet, men endringer som andre gjør vil vi ikke se uten at vi åpner recordsettet på nytt. Dette kan selvfølgelig føre til at våre endringer vil kunne overskrive andres, som vi ikke vet om! Dette er den raskeste kursoren, og den som anbefales brukt så langt det er mulig. Vi kan sette opp følgende oversikt over de ulike typene kursorer: kursortype, konstantnavn i parentes Forward Only (adopenforwardonly) Den raskeste, den som gjelder dersom vi ikke oppgir noe, henter data kun én gang, i det recordsettet åpnes. Keyset (adopenkeyset) Henter kun rad-identifikatorer ved åpning, henter friske data for hver etterspørsel. Dynamic (adopendynamic) Gjentar forespørselen til databasen hver gang en rad etterspørres. (Denne kursortypen støttes ikke av Microsoft Access. I stedet vil Keyset bli brukt.) Static (adopenstatic) Henter data kun én gang, i det recordsettet åpnes. forflytning bare framover alle muligheter alle muligheter alle muligheter andre endrer data andre sletter rader andre setter inn nye rader vises ikke vises ikke vises ikke vises vises vises ikke vises vises vises vises ikke vises ikke vises ikke side 4 av 9

Recordsettet vil vanligvis lagres på tjenersiden, men det er også mulig å lagre det på klientsiden. Enkelte typer funksjonalitet krever at recordsettet er lagret hos klienten. Kursortypen må i tilfelle være Static. Egenskapen CursorLocation styrer hvor recordsettet skal lagres. Dersom vi ikke oppgir noe vil det lagres på tjenersiden. Mer om dette side 573. Alle kursortypene unntatt Forward Only gir oss muligheten til å forflytte oss framover og bakover. Følgende metoder er aktuelle: MoveFirst() MoveLast() MoveNext() MovePrevious() Move(antall) flytt til første rad flytt til siste rad flytt til neste rad flytt til forrige rad flytt et antall rader, negativt tall betyr bakover På tilsvarende måte som egenskapen EOF er True når vi har kommet forbi slutten av recordsettet, vil BOF være True når vi har kommet forbi begynnelsen. Følgende kodebit gjennomløper recordsettet bakfra: objresultat.movelast() Do While Not objresultat.bof Response.Write objresultat("id") & " " & objresultat("fornavn") & _ " " & objresultat("etternavn") & "<BR>" objresultat.previous() Loop Flere eksempler, se boka side 630-640. Merk spesielt egenskapen RecordCount. Den gir oss antall rader i recordsettet, men den krever at en annen kursor enn ForwardOnly brukes. 10.3. Å kjøre SQL-setninger i Access I leksjon 8 ble du så vidt kjent med SQL. SQL inneholder kommandoer for å generere tabellene, for å hente ut, endre, lagre og slette data. Vi skal ganske snart se flere eksempler der vi bruker SQL i ASP. Øvingen denne gangen handler også om dette. Det er imidlertid en fordel å prøve ut setningene før vi legger dem inn i koden vår. En bestemt type SQL-setning (SELECT-setninger) kan du enklest prøve ut ved å kjøre eksemplet i kapittel 1 i denne leksjonen. Andre typer SQL-setninger kan du prøve ved å bruke Access. Følg trinnene 1-5 på figurene nedenfor for å få utført SQL-kommandoer i Access. (Setningen som utføres her er av den typen der du kunne brukt eksemplet foran, men ettersom vi ikke har sett på andre typer SQLsetninger ennå, bruker vi denne her.) side 5 av 9

Figur 2: Å bruke SQL i Access. Trinn 1: Åpne databasen, klikk på "Spørringer" til venstre, og velg "Lag spørring i utformingsvisning" Figur 3: Å bruke SQL i Access. Trinn 2: Du får opp dette vinduet. Lukk det. Figur 4: Å bruke SQL i Access. Trinn 3: Klikk på SQL-knappen i verktøylinjen (til venstre!) side 6 av 9

Figur 5: Å bruke SQL i Access. Trinn 4: Skriv inn Selectsetningen som vist her. Husk semikolon etter setningen. Trykk på det RØDE utropstegnet i verktøylinjen Figur 6: Å bruke SQL i Access. Trinn 5: Her er resultatet! Lukk vinduene, det er ikke nødvendig å lagre ettersom dette bare er en prøve. 10.4. SQL og de fire databaseoperasjonene Det er fire ting vi kan gjøre med en database: 1 Vise fram data. Dataene kan hentes fra en eller flere fysiske tabeller i databasen. Vanligvis viser vi fram et utvalg, for eksempel alle personer med navn som begynner på A og som bor i Trondheim. Dette utvalget kan gjerne være bestemt av brukeren. Vi bruker SQL-setningen SELECT til å utføre slike operasjoner som dette. Eksempel på SQL-setninger: select * from person where idnr > 20 select * from person where etternavn > D side 7 av 9

2 Slette data. Man sletter hele rader i en tabell. Radene som skal slettes bør identifiseres med primærnøkkelen. SQL-setningen DELETE kan brukes til å slette én eller flere rader i en tabell. Eksempler: -- sletter person nr 17 delete from person where id = 17 -- sletter aller personer med nr > 20 delete from person where id > 20 -- sletter alle(!) radene i tabellen delete from person 3 Legge inn nye data. Man legger alltid inn hele rader med data. Primærnøkkelen må alltid ha verdi. Øvrige felt kan ha verdi eller være tomme. Et tomt felt har per definisjon verdien NULL. Det er ikke det samme som en tom streng. Den som lager databasen kan angi at et felt er obligatorisk. Det vil ikke være tillatt å legge inn en rad med en primærnøkkelverdi som allerede eksisterer i tabellen. SQL-setningen INSERT brukes til å legge inn nye rader i en tabell. Eksempel: insert into person values(34, Anne Kristine, Pettersen ) insert into person values(35, NULL, Jensen ) 4 Endre data. Man forandrer innholdet i en eller flere rader av gangen. Enkeltfelter som har verdien NULL kan få verdi, og felter som har en verdi kan settes lik NULL (dersom de ikke er obligatoriske). Det er ikke god databaseskikk å endre primærnøkkelen. Da sletter man i stedet raden, og setter inn en ny. SQL-setningen UPDATE brukes når vi skal forandre på innholdet i en eller flere rader. Eksempler: -- alle fornavn og alle etternavn settes lik Ukjent update person set fornavn = Ukjent, etternavn = Ukjent -- endrer etternavnet til person nr 25 update person set etternavn = Haugen where id = 25 -- skifter etternavn på alle som heter Hauge update person set etternavn = Haugen where etternavn = Hauge -- bruker is og ikke lik ved test mot NULL update person set fornavn = 'Ukjent' where fornavn is NULL; Som du ser, verdien NULL er litt spesiell. Du kan også risikere at den behandles forskjellig fra databasesystem til databasesystem. Kravene om entydig primærnøkkel er tatt med foran. I tillegg er det krav som følger av at man i en tabell refererer til en annen tabell ved å bruke dennes primærnøkkel. Disse kravene berører både sletting, innsetting og endring, og de er dermed relativt kompliserte og ikke tatt med her. Som sagt, de SQL-setningene du trenger i dette kurset, får du oppgitt. Kapittel 19 i boka gjennomgår SELECT-setningen relativt grundig. De tre andre setningene er ikke nevnt. Det finnes imidlertid mange innføringer i SQL på Internett. Prøv for eksempel http://sqlzoo.net/. Når vi nå skal bruke SQL i ASP gjelder det å huske følgende: I ASP-koden setter vi opp metode-kall som sender SQL-setningen til databasesystemet. Tilbake fra databasesystemet får vi resultatet av setningen. side 8 av 9

Hvis vi sender inn en SELECT-setning, får vi tilbake et Recordset-objekt med resultatradene. Hvis vi sender inn en INSERT-, DELETE- eller UPDATE-setning, får vi tilbake beskjed om hvor mange rader som er berørt. Eller, dersom ting ikke går bra, så får vi en feilmelding tilbake fra databasesystemet. Ordlyden i denne meldingen varierer med databasesystem. 10.5. Connection.Execute() Execute() er gjennomgått i boka side 644-647, men oppdatering av databasen med Exceute() er ikke tatt med. Denne måten å bruke Execute() på er faktisk den viktigste. Vi har tidligere laget et recordsett på følgende måte: ' Oppretter forbindelse til databasen Set objdbforbindelse = Server.CreateObject("ADODB.Connection") objdbforbindelse.open "dsn=personer" ' Kopierer innholdet i tabellen person til "recordsettet" objresultat Set objresultat = Server.CreateObject("ADODB.Recordset") objresultat.open select * from person where idnr > 20, _ objdbforbindelse,,, adcmdtext Her har vi brukt en SQL-setning når vi åpner recordsettet, vi kan også sette et tabellnavn: objresultat.open person, objdbforbindelse,,, adcmdtable Det er ofte slik at vi i en ASP oppretter et Recordset-objekt, fyller det med data, bruker dataene til et eller annet, for deretter å lukke recordsettet, og til slutt slette objektet. Det som karakteriserer denne situasjonen er at vi bruker Recordset-objektet bare én gang. I slike situasjoner finnes det en snarvei: Vi sender SQL-setningen (eller tabell-navnet) direkte til Connection-objektet. Et recordsett-objekt blir i tilfelle automatisk laget. Denne metoden er også mer effektiv sett fra et ytelsesperspektiv. Kodesnutten over vil dermed se slik ut: ' Oppretter forbindelse til databasen Set objdbforbindelse = Server.CreateObject("ADODB.Connection") objdbforbindelse.open "dsn=personer" Set objresultat = objdbforbindelse.execute("select * from person where ID > 20") Vi kan også bruke Execute til å legge inn en ny rad i databasen: objdbforbindelse.execute _ "insert into person values(137, 'Ole', 'Pettersen')", antrader Merk at vi bruker Exceute som subrutine, vi kan derfor ikke ha parenteser rundt argumentene. Etter kallet vil antrader inneholde antall berørte rader. I dette tilfellet har vi lagt inn 1 rad, antrader vil derfor være lik 1. Andre setninger som endrer databaseinnholdet kan berøre flere rader, for eksempel vil setningen delete from person where id > 100 slette alle rader med id > 100. Antall rader som ble slettet finner vi i ut-argumentet antrader. Læreboka anbefaler ikke å bruke Execute() til å lage recordsett. Begrunnelsen er at det er mindre lesbart. Imidlertid er Execute() veldig mye brukt, og personlig tror jeg de fleste klarer å se for seg Recordset-objektet selv om de ikke lager det eksplisitt ved å bruke Server. CreateObject(). Oppdatering av databaseinnholdet ved å sende en SQL-setning til databasen er langt mer effektivt enn å hente et Recordset-objekt og så gjøre endringene i dette. side 9 av 9