pgMedlem sedan feb. 200235 inlägg
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
LarsGMedlem sedan dec. 200012 465 inlägg
com.execute ,rows,128
Varför har du limit 1 med?
pgMedlem sedan feb. 200235 inlägg
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
LarsGMedlem sedan dec. 200012 465 inlägg
Rows (andra parametern till execute) är en utparameter som anger antalet påverkade poster.
Om ID är unikt så är limit helt onödigt.
pgMedlem sedan feb. 200235 inlägg
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
Engine^Medlem sedan dec. 20002 861 inlägg
Det har skett en liten förväxling här mellan Connection.Execute() och Command.Execute()
Com.Execute rows, , 128
pgMedlem sedan feb. 200235 inlägg
Groovy. Nu funkar det. Tackar!