ASPNL logo (1 kb)
zaterdag 17 mei 2008




Microsoft MVP

.NET Codewise Community
<< vorige | overzicht | volgende >>

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)

<< vorige | ^ naar boven | overzicht | volgende >>
copyright 2000-2007 ASPNL