webForumDet fria alternativet

Ändra kodstruktur

ASPur ASP

30 svar · 1 353 visningar · startad av dareknowak

Medlem sedan mars 200973 inlägg
Frågan#1

Tänkte förenkla min kodstruktur lite men har nu fastnat.

Men hur förenklar man detta?

Set objConn = Server.CreateObject("ADODB.Connection")
Set objRS = Server.CreateObject("ADODB.RecordSet")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & sDatabasePath

SQL = "SELECT * FROM tabell"
objConn.Execute SQL
objRS.Open SQL, objConn, adOpenStatic, adLockOptimistic

objRS.AddNew

objRS("user") = strUser

objRS.Update
objRS.Close
objConn.Close

Testade med detta men funkade inte och fick error

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & sDatabasePath
set objRS=objConn.execute("SELECT * FROM tabell",adOpenStatic, adLockOptimistic)

objRS.AddNew

objRS("user") = strUser

objRS.Update
objRS.Close
objConn.Close

Felmeddelande:
"ADODB.Connection fel '800a0bb9'

Parametrarna är felaktiga, ligger utanför tillåtet intervall eller skapar en inbördes konflikt.

/test/index.asp, rad 14"

Rad 14: "set objRS=objConn.execute("SELECT * FROM tabell",adOpenStatic, adLockOptimistic)"

Medlem sedan juni 20019 519 inlägg
#2

set objRS=objConn.execute("SELECT * FROM tabell")

Men du borde verkligen inte använda dig av något av dessa, använd en SQL INSERT INTO istället för det du försöker göra nu.

Medlem sedan mars 200973 inlägg
#3

voigtann1 skrev:

set objRS=objConn.execute("SELECT * FROM tabell")

Men du borde verkligen inte använda dig av något av dessa, använd en SQL INSERT INTO istället för det du försöker göra nu.

Använder jag mig av den så får jag fram följande felmeddelande:
"ADODB.Recordset fel '800a0cb3'

Aktuellt Recordset kan inte uppdateras. Det kan bero på en begränsning av providern eller den valda låstypen.

/nowakit/kundvagn.asp, rad 16"

Rad 16: "objRS.AddNew"

Vad är det egentligen för skillnad att använda SELECT och lägga in information med objrs("test") = värde än att använda INSERT INTO och lägga in det direkt i sql satsen?

Medlem sedan aug. 2003480 inlägg
#4
Set objConn = Server.CreateObject("ADODB.Connection") 
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & sDatabasePath

objConn.Execute("INSERT INTO tabell (user) Values('"& strUser &"')")

objConn.Close : Set objConn = nothing
Medlem sedan mars 200973 inlägg
#5

Biasse skrev:

Set objConn = Server.CreateObject("ADODB.Connection") 
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & sDatabasePath

objConn.Execute("INSERT INTO tabell (user) Values('"& strUser &"')")

objConn.Close : Set objConn = nothing

Jo jag vet hur man gör men menade på vad det är för skillnad rent tekniskt?

Medlem sedan juni 20019 519 inlägg
#6

Att du använder ett Recordset för att uppdatera, medans med Connection ojbektet så kör du en riktigt SQL insert.

Medlem sedan dec. 2004736 inlägg
#7

SELECT * FROM tabell hämtar ALLT från tabell, och du behöver inte detta till något. Att köra en INSERT TO blir därmed enormt mycket bättre sett till prestandan, då du inte skapar några onödiga objekt som du inte behöver.

Medlem sedan mars 200973 inlägg
#8

Men INSERT TO kan inte användas i det här sammanhanget? Då måste jag använda mig av ett recordset?

strUser = objRS("user")
If objRS("user") = strUser Then
objRS("antal") = objRS("antal") +1
End If
Medlem sedan dec. 2004736 inlägg
#9

Något i stil med "UPDATE tabell SET antal = antal + 1 WHERE user = '" & strUser "'" borde fungera!

Medlem sedan nov. 20014 054 inlägg
#10
strUser = objRS("user")
If objRS("user") = strUser Then
objRS("antal") = objRS("antal") +1
End If

Det där ser ut som en UPDATE.

Det finns tre grundkommandon i SQL.
1 ) INSERT INTO table, vilket lägger in en ny post med data i en tabell.
2 ) UPDATE table , vilket uppdaterar en befintlig post med ny data.
3 ) SELECT , vilket hämtar rader med data från en tabell baserad på vilkor.

Kan väl säga så, det är lite skillnad på ADORecordset objekt insättning och connection objekt insättning.

Connection objektet är snabbare och kräver mindre resurser av servern, medans recordset objektet är mer resurskrävande.

Connection objektet är vanligtvis det man brukar föredra. Dock är det i slutändan upp till var och en vad man väljer.

Mycket beror också på hur pass mycket belastning scripten har. :)

Medlem sedan mars 200973 inlägg
#11

Okej, skulle det vara bättre att göra såhär?

If objRS("user") = strUser Then
sqlupdate
Else
sqlinsertto
End If

I detta läge måste jag ju skapa ett recordset i vilket fall och kanske lika bra att updatera direkt via det?

Medlem sedan mars 200973 inlägg
#12

varför går det inte köra den if satsen bara för objrs("user") är tom? (När tabellen i databasen är tömd)
Hur löser man det?

Medlem sedan juni 20019 519 inlägg
#13
If objRS.EOF
'INSERT
Else
'UPDATE
End If

Om en SQL inte retunera någon data så har den inte några fält att arbeta med. så du får använda dig av End Of File (EOF) för att se om den innehåller någon data efter SQL frågan.

Medlem sedan mars 200973 inlägg
#14

Så det ska alltså bli såhär då?

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & sDatabasePath

Set objRS=objConn.execute("SELECT * FROM [tabell] WHERE user = '" & strUser & "' AND usertype = '" & strUsertype & "'")

If objRS.EOF Then
objConn.Execute("INSERT INTO tabell (user,usertype,antal) Values('"& strUser &"','"& strUsertype &"','"& strAntal &"')")
Else
objConn.Execute("UPDATE tabell SET antal = antal + 1 WHERE user = '" & strUser & "'")
End If

objRS.Close
objConn.Close

Blir det då inte lättare och mindre prestanda krävande att göra detta direkt med ett recordset?

Medlem sedan mars 200973 inlägg
#15

Ett ja eller nej skulle sitta fint? :)

Medlem sedan juni 20019 519 inlägg
#16

Set objRS=objConn.execute("SELECT * FROM [tabell] WHERE user = '" & strUser & "' AND usertype = '" & strUsertype & "'")

Om du inte skall använda recordsetet mer än att se att användaren finns så behöver du inte hämta ut all data med *, räcker med exempelvis användarnamn eller select 1 .... för att retunera 1(och inte EOF).

Medlem sedan mars 200973 inlägg
#17

Men för att få svar på min huvudsakliga fråga så kan vi ta ett annat exempel hur får man detta

SQL = "DELETE FROM tabell WHERE user = '" & strUser "'"
   objConn.Execute SQL,,128

till denna formen

objConn.execute("DELETE FROM tabell WHERE user = '" & strUser "'")

Hur man alltså får in ",,128" i sql satsen?

Medlem sedan dec. 2004736 inlägg
#18

Gissning, men:

objConn.execute("DELETE FROM tabell WHERE user = '" & strUser "'",,128)

borde fungera.

Medlem sedan mars 200973 inlägg
#19

Ledel skrev:

Gissning, men:

objConn.execute("DELETE FROM tabell WHERE user = '" & strUser "'",,128)

borde fungera.

Japp det trodde jag osså men då får jag felmeddelande:

Kompileringsfel i Microsoft VBScript fel '800a0414'

Det går inte att använda parenteser när en Sub anropas.

/test/index.asp, rad 29

objConn.execute("DELETE FROM tabell WHERE user = '" & strUser & "'",,128)

Medlem sedan juni 200032 969 inlägg
#20

Bort med parenteserna. Maken till tydligt felmeddelande... ;)

137 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)