Engine^Medlem sedan dec. 20003 887 inläggDen första loopen går att snabba upp lite grand
Addera = "Select 1 From tbluppgifter WHERE username = '" & Replace(Request.Form("username"), "'", "''") & "'"
RecSetREG.Open Addera, ConnectREG, 3, 3
If Not RecSetREG.EOF Then
Session("meddelande") = " Detta användarnamn va upptaget, var vänlig och välj ett annat."
RecSetREG.Close
Set RecSetREG = Nothing
Response.Redirect "/Plus/bli_medlem.asp"
End If
RecSetREG.Close
Undrar lite om ReplikeringsID i access, vad vinner man på att använda den som ID, istället för att få 1,2,3 osv..
Ex.
{E17FC3B1-BFE1-460F-8FB0-E4EB56BE1B48}
Engine^Medlem sedan dec. 20003 887 inläggDet kan vara bra om du använder databasreplikering och synkroniserar, men annars så tror jag inte att man har någon nytta av det.
Engine^Medlem sedan dec. 20003 887 inlägg
OveRRidE skrev:
- Du har inte en enda Dim i hela koden. Option Explicit saknas också.
- Sålänge du inte måste eller har bra anledning till att köra .open med de där konstanterna, och vill ha prestanda, så rekommenderar jag .execute(dinSQL),,128 på connection-objectet istället, då slipper du dessutom att skapa (eller få tillbaks) ett recordset.
- Använd While...Wend istället för Do Until, det skall vara en aning snabbare.
- Är inte alla variabler i VBScript av typen Variant? Hjälper det något om man använder Dim?
- Hmm... är det inte så att Connection.Execute implicit skapar ett recordset? Det hade jag för mig ivarjefall.
- All prestandaförtjänst är bra :) Oavsett om man använder While...Wend eller Do Until...Loop, så tjänar man betydligt mer på att referera till kolumner i ett recordset i en loop med ett index. Ex.: Recordset(i) istället för Recordset("kolumnnamn")
Med det sagt kan jag ju bidra med ett kodexempel också...
<%
Option Explicit
Response.Buffer = True
Function FixInject(strSource)
FixInject = Replace(strSource, "'", "''")
End Function
Dim Addera, ConnectREG, lngRA, strConn
Set ConnectREG = Server.CreateObject("ADODB.Connection")
strConn = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=g:\hom\plus.mdb;"
Addera = "UPDATE tbluppgifter SET username = username WHERE username = '" & FixInject(Request.Form("username")) & "'"
ConnectREG.Open strConn
ConnectREG.Execute Addera, lngRA, 128
ConnectREG.Close
If lngRA > 0 Then
Session("meddelande") = " Detta användarnamn va upptaget, var vänlig och välj ett annat."
Set ConnectREG = Nothing
Response.Redirect "/Plus/bli_medlem.asp"
End If
Addera = "INSERT INTO tbluppgifter (username, password, regIP, lastIP, fname, lname, authkey, reggad) VALUES " & _
"('" & FixInject(Request.Form("username")) & "'" & _
", '" & FixInject(Request.Form("password")) & "'" & _
", '" & FixInject(Request.Form("regIP")) & "'" & _
", '" & FixInject(Request.Form("LastIP")) & "'" & _
", '" & FixInject(Request.Form("fname")) & "'" & _
", '" & FixInject(Request.Form("lname")) & "'" & _
", '" & FixInject(Request.Form("authkey")) & "'" & _
", #" & Now() & "#)"
ConnectREG.Open strConn
ConnectREG.Execute Addera, , 128
ConnectREG.Close
Set ConnectReg = Nothing
@ndersMedlem sedan juni 200032 967 inlägg
Engine^ skrev:
Hmm... är det inte så att Connection.Execute implicit skapar ett recordset? Det hade jag för mig ivarjefall.
Jo, det stämmer. Så länge man inte slänger med 128 (konstantens namn är adExecuteNoRecords) när man exekverar sin SQL-fråga, enligt OveRRidEs förslag ovan.
red: fan ta överridaren för blandningen av gemener och versaler. ;)
Mvh
Engine^Medlem sedan dec. 20003 887 inlägg
@nders skrev:
Så länge man inte slänger med 128 (konstantens namn är adExecuteNoRecords) när man exekverar sin SQL-fråga, enligt OveRRiDes förslag ovan.
Jag kom på det när jag knapprade ner mitt kodförslag :) Ibland hänger man inte med sig själv i sina egna svängar ens en gång ;)
OOveRRidEMedlem sedan feb. 200112 078 inlägg
Motorn skrev:
Är inte alla variabler i VBScript av typen Variant? Hjälper det något om man använder Dim?
Det stämmer, då det egentligen inte finns några datatyper i VBScript, utan precis som du säger; varianter.
Jag har dock en förnimmelse av att Dim ger en prestandaökning, men jag kan dock ha fel. I vilket fall som helst; Option Explicit, som tvingar Dim på alla variablar, ger ju dock fördelar i din felsökning och det nu skulle vara så att du namnger något fel. På det viset vinner man nog i tid på att använda det.
Engine^:
Så det fungerar bättre med det kodförslaget som du skrev nyss? Då tar jag och använder mig av den i fortsättningen :)
Om ni andra inte har nått att tillägga ;)
Engine^Medlem sedan dec. 20003 887 inläggUr prestandasynpunkt kan man säga att det fungerar bättre. Men om man inte riktigt förstår koden, så fungerar det nog faktiskt sämre... :)
Jag skulle ha skrivit på det sättet från början, eftersom jag kodar efter den stilen :)
Hoppas det fungerar bra för dig också. :bire
SSebbeMedlem sedan jan. 20032 285 inlägg En liten fråga bara: varför öppnar och stänger du connection-objectet två gånger? :q
Engine^Medlem sedan dec. 20003 887 inlägg
Sebbe skrev:
En liten fråga bara: varför öppnar och stänger du connection-objectet två gånger? :q
För att vara säker på att det är stängt i händelse av att namnet var upptaget och det sker en Response.Redirect.
SSebbeMedlem sedan jan. 20032 285 inlägg Jo, men är det inte bara att lägga .Close i If-satsen också?
Då behöver du ju inte öppna objektet igen, eftersom att om det stängdes så skickades användaren iväg till en annan sida.
Eller? :q
Engine^Medlem sedan dec. 20003 887 inläggSant. Det är en bättre lösning att flytta in den första ConnectREG.Close till If-satsen. Då slipper man en smula overhead för att anropa Close, Open i onödan :)
Skippa Sessionen är ju också ett tips sätt en querystring med ett nummer vilket felmeddelande och ha en sträng med en array där det finns olika felmeddelanden i filen som den skickas vidare till.
Server.CreateObject("ADODB.Recordset")
När man skapar objektet borde väl det ta upp minne :S. Så är det inte bättre att skippa det ?
Engine^Medlem sedan dec. 20003 887 inlägg
Nickemannen skrev:
Skippa Sessionen är ju också ett tips sätt en querystring med ett nummer vilket felmeddelande och ha en sträng med en array där det finns olika felmeddelanden i filen som den skickas vidare till.
Det kan ju vara att föredra. Exempel kan man ju skicka tillbaka esmg=1 och sedan hantera det med
intError = Request.QueryString("emsg")
Select Case intError
Case 1
Response.Write "Namnet var upptaget. Välj ett annat."
End Select
Nickemannen skrev:
Server.CreateObject("ADODB.Recordset")
När man skapar objektet borde väl det ta upp minne :S. Så är det inte bättre att skippa det ?
Det är ju redan gjort... tittade du på fel kod kanske? ;)
Vi tar koden igen...
<%
Option Explicit
Response.Buffer = True
Function FixInject(strSource)
FixInject = Replace(strSource, "'", "''")
End Function
Dim Addera, ConnectREG, lngRA, strConn
Set ConnectREG = Server.CreateObject("ADODB.Connection")
strConn = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=g:\hom\plus.mdb;"
Addera = "UPDATE tbluppgifter SET username = username WHERE username = '" & FixInject(Request.Form("username")) & "'"
ConnectREG.Open strConn
ConnectREG.Execute Addera, lngRA, 128
If lngRA > 0 Then
Session("meddelande") = " Detta användarnamn va upptaget, var vänlig och välj ett annat."
ConnectREG.Close
Set ConnectREG = Nothing
Response.Redirect "/Plus/bli_medlem.asp"
[blue]'Response.Redirect "/plus/bli_medlem.asp&emsg=1" 'En annan metod, som kan vara trevlig[/blue]
End If
Addera = "INSERT INTO tbluppgifter (username, password, regIP, lastIP, fname, lname, authkey, reggad) VALUES " & _
"('" & FixInject(Request.Form("username")) & "'" & _
", '" & FixInject(Request.Form("password")) & "'" & _
", '" & FixInject(Request.Form("regIP")) & "'" & _
", '" & FixInject(Request.Form("LastIP")) & "'" & _
", '" & FixInject(Request.Form("fname")) & "'" & _
", '" & FixInject(Request.Form("lname")) & "'" & _
", '" & FixInject(Request.Form("authkey")) & "'" & _
", #" & Now() & "#)"
ConnectREG.Open strConn
ConnectREG.Execute Addera, , 128
ConnectREG.Close
Set ConnectReg = Nothing
Jag får fel på:
rad: ConnectREG.Execute Addera, , 128
Microsoft JET Database Engine fel '80040e14'
Syntaxfel i INSERT INTO-uttryck.
Engine^Medlem sedan dec. 20003 887 inläggOk. Det är ett fel i frågan... skriv ut frågan, så är det enklare att se vart jag har gjort en miss någonstans.
Response.Write Addera
Engine^ skrev:
Ok. Det är ett fel i frågan... skriv ut frågan, så är det enklare att se vart jag har gjort en miss någonstans.
Response.Write Addera
Satte den ovan för Addera = "INSERT INTO tbluppgifter (username,......
då blev det:
UPDATE tbluppgifter SET username = username WHERE username = 'testuser'
och om jag sätter den under Addera = "INSERT INTO...
blev det:
INSERT INTO tbluppgifter (username, password, regIP, lastIP, fname, lname, authkey, reggad) VALUES ('tesuser', '12345', 'testa', 'skriva', 'hej', 'jag', 'ska', #2003-11-17 16:49:24#)