webForumDet fria alternativet

SQL & ADODB.Command fråga

Databaser & SQL

6 svar · 360 visningar · startad av pg

Medlem sedan feb. 200235 inlägg
Frågan#1

Hej jag har en fråga om ADODB.Command.
När jag uppdaterar en post i databasen (MySQL) på nedanstående sätt, finns det möjlighet att få information i retur om uppdateringen lyckades. T.ex genom att erhålla antalet påverkade poster, eller kan man ändra sql-satsen på något sätt kanske.

Jag vill alltså kolla om posten existerar samt uppdatera denna utan att behöva skriva och köra två separata SQL-satser.

Dim SQL
SQL = " UPDATE tblData SET "
SQL = SQL & " nIQ = 23 "
SQL = SQL & " WHERE ID = ? "
SQL = SQL & " AND sName = ? "
SQL = SQL & " LIMIT 1 "

Dim Com
Set Com = Server.CreateObject("ADODB.Command")
Com.ActiveConnection = Con
Com.CommandTimeout = 40
Com.CommandType = 1
Com.CommandText = SQL
Com.Prepared = True

Com.Parameters.Append Com.CreateParameter("ID", 3, 1, 11, 39)
Com.Parameters.Append Com.CreateParameter("sName", 200, 1, 10, "Peter")

Com.Execute
Set Com = Nothing

Tackar på förhand för alla svar. /PG

Medlem sedan dec. 200012 464 inlägg
#2
com.execute ,rows,128

Varför har du limit 1 med?

Medlem sedan feb. 200235 inlägg
#3

Tack för svaret, men det blev inte riktigt som jag tänkt mig.
Rows är väl "indata"-parameter till Com.Execute. Det jag är ute efter är ett returvärde från Com.Execute som talar om hur många poster som uppdaterats.

Angående LIMIT 1.
Visserligen är ID ett unikt fält vilket gör att resultatet blir detsamma utan LIMIT 1. Men jag har fått för mig att LIMIT 1 gör att sql-satsen körs snabbare. Om man t.ex har 1000000 poster, så utan LIMIT 1 letar MySQL igenom alla poster. I alla fall borde det vara så om man vänder på villkoren och jämför sName som inte är unikt först.
SQL = SQL & " WHERE sName = ? "
SQL = SQL & " AND ID = ? "
Men jag har kanske fel.
I alla fall så tycker jag det är en bra regel att ha med LIMIT 1 i fall man någon gång skulle råka skriva en felaktig SQL-sats som annars skulle rensar en hel tabell.

I mitt fall med Com.Execute ... så är det därmed värdet 0 eller 1 jag skulle vilja ha som svar.

/PG

Medlem sedan dec. 200012 464 inlägg
#4

Rows (andra parametern till execute) är en utparameter som anger antalet påverkade poster.

Om ID är unikt så är limit helt onödigt.

Medlem sedan feb. 200235 inlägg
#5

Tack igen. Men vad gör jag för fel?

När jag kör detta exempet med Com.Execute , rows, 128 så får jag ingen uppdateringen av posten. Om jag byter till Com.Execute så uppdateras den.

Dim SQL, rows
SQL = " UPDATE " & sSessionName & "_AdminData SET "
SQL = SQL & " sUseCookieLogin = 'N' "
SQL = SQL & " , sUseIPLogin = 'N' "
SQL = SQL & " WHERE AdminDataID = ? "
SQL = SQL & " AND sDisableCode = ? "

Dim Com
Set Com = Server.CreateObject("ADODB.Command")
Com.ActiveConnection = Con
Com.CommandTimeout = 40
Com.CommandType = 1
Com.CommandText = SQL
Com.Prepared = True

Com.Parameters.Append Com.CreateParameter("AdminDataID", 3, 1, 11, accountID)
Com.Parameters.Append Com.CreateParameter("sDisableCode", 129, 1, 10, codeID)

Com.Execute , rows, 128
Response.Write "rows = " & rows

Set Com = Nothing

/PG

Medlem sedan dec. 20003 887 inlägg
#6

Det har skett en liten förväxling här mellan Connection.Execute() och Command.Execute()

Com.Execute rows, , 128
Medlem sedan feb. 200235 inlägg
#7

Groovy. Nu funkar det. Tackar!

262 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)