Het snelst autonummering opvragen
Door Ken Schaefer
9 juli 2001
De uitdaging:
Mensen vragen vaak hoe ze een autonummering kunnen opvragen voor een nieuw ingevoegd record in Access.
Tot voor kort gingen we er allemaal vanuit dat de makkelijkste manier om dit te doen via een ADO Recordset was. Voor details hoe je dit doet
klik hier.
Recentelijk heeft Peter Johnson een link geplaatst naar een Microsoft KB artikel om erop te wijzen dat de OLEDB Provider for Jet de SELECT @@Identity query nu ondersteunt
(zie KB Q232144).
Dus wat is sneller?
Testplatform
De testen werden gedaan op een Dual Pentium II 400 MHz met 128 MB 100 MHz ECC SDRAM.
De server werkt op NT Server v4 (met SP6a) en IIS v4 met MDAC 2.5 en de v5.1 VBScript Engine.
De resultaten
Aangezien dit is waar het meeste mensen om gaat, staat het bovenaan :-)
De resultaten zijn in milliseconden. Deel het door 1000 om het aantal seconden te krijgen.
| Test nummer |
Met gebruik van .AddNew |
Met gebruik van @@Identity |
| 1 |
3 921 |
3 938 |
| 2 |
4 140 |
3 922 |
| 3 |
3 907 |
3 952 |
| 4 |
4 125 |
3 953 |
| 5 |
3 906 |
3 922 |
| 6 |
4 201 |
3 928 |
De code
Elke test werd 7 keer gedaan, waarbij het eerste resultaat terzijde is gelegd (om IIS in staat te stellen de gecompileerde p-code voor de pagina te cachen).
Elke test bestond uit het 50 keer herhalen van de operatie en het noteren van de hoeveelheid tijd die het kostte. De werkelijke code zoals die in zijn
geheel gebruikt is (plus de voorbeeld database) kan hier gedownload worden.
De database was een simpele Access 2000 database met 1 tabel (table1).
Deze bevat 2 velden:
- field1ID - autonummer
- field1txtfield - tekst, vereist, lengte=50, niet geïndexeerd
Het timer script dat werd gebruikt was de speedtimer zoals beschreven in Hoe snel is mijn script?
De code voor elke test was als volgt:
De ADO RecordSet/.AddNew methode
For i = 1 To 50
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConnect
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open "table1", objConn, adOpenForwardOnly, adLockOptimistic, _
adCmdTableDirect
objRS.AddNew
objRS.Fields.Item(1).Value = "test1"
objRS.Update
intID = objRS.Fields.Item(0).Value
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
Next
De @@Identity methode
For i = 1 To 50
strSQL = "INSERT INTO table1"
strSQL = strSQL & "(table1txtfield)"
strSQL = strSQL & "VALUES('test2')"
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConnect
objConn.Execute strSQL,,adCmdText + adExecuteNoRecords
strSQ:1 = "SELECT @@Identity"
Set objRS = Server.CreateObject("ADODB.REcordSet")
objRS.Open strSQL1,objConn, adOpenForwardOnly, adLockReadOnly, adCMDText
intID = objRS.Fields.Item(0).value
objRS.close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
Next
© Ken Schaefer
(vertaling copyright ASPNL)
|