webForumDet fria alternativet

Några invändningar mot den?

ASP

31 svar · 1 026 visningar · startad av medialabs

Medlem sedan mars 20023 686 inlägg
Frågan#1

df

Medlem sedan dec. 20003 887 inlägg
#2

Den 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
Medlem sedan mars 20023 686 inlägg
#3

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}

Medlem sedan dec. 20003 887 inlägg
#4

Det kan vara bra om du använder databasreplikering och synkroniserar, men annars så tror jag inte att man har någon nytta av det.

Medlem sedan feb. 200112 078 inlägg
#5
  • 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.
Medlem sedan dec. 20003 887 inlägg
#6

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
Medlem sedan juni 200032 967 inlägg
#7

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

Medlem sedan dec. 20003 887 inlägg
#8

@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 ;)

Medlem sedan feb. 200112 078 inlägg
#9

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.

Medlem sedan mars 20023 686 inlägg
#10

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 ;)

Medlem sedan dec. 20003 887 inlägg
#11

Ur 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

Medlem sedan jan. 20032 285 inlägg
#12

En liten fråga bara: varför öppnar och stänger du connection-objectet två gånger? :q

Medlem sedan dec. 20003 887 inlägg
#13

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.

Medlem sedan jan. 20032 285 inlägg
#14

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

Medlem sedan dec. 20003 887 inlägg
#15

Sant. 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 :)

Medlem sedan aug. 20003 575 inlägg
#16

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 ?

Medlem sedan dec. 20003 887 inlägg
#17

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
Medlem sedan mars 20023 686 inlägg
#18

Jag får fel på:

rad: ConnectREG.Execute Addera, , 128

Microsoft JET Database Engine fel '80040e14'

Syntaxfel i INSERT INTO-uttryck.

Medlem sedan dec. 20003 887 inlägg
#19

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
Medlem sedan mars 20023 686 inlägg
#20

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#)

260 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)