webForumDet fria alternativet

Flera "Command" nödvändigt?

ASP

6 svar · 250 visningar · startad av Calevan

Medlem sedan maj 20031 173 inlägg
Frågan#1

Hej!

Jag tänkte köra två SQL kommandon efter varandra och nu när jag börjat med att annvända Command så undrar jag helt enkelt om jag måste göra två Command (som i exemplet nedan) eller om jag, efter att ha använt det första, kan nollställa det och använda samma? känns onödigt att behöva skapa två Command.

tack!

   Set Command = server.createobject("ADODB.Command")
   Command.ActiveConnection = Connect
   Set Command2 = server.createobject("ADODB.Command")
   Command2.ActiveConnection = Connect
      
   strKommentar = Request.Form("formKommentar")
   strSkribent = Request.Form("formSkribent")
   strDatum = Now

   strSQL = "INSERT INTO tblKommentar (Datum, Kommentaren, Skribent) VALUES (?,?,?)"
   Command.CommandText = strSQL

   Command.Parameters.Append(Command.CreateParameter("Datum", adVarChar, adParamInput, 50, strDatum))
   Command.Parameters.Append(Command.CreateParameter("Kommentaren", adVarChar, adParamInput, 50, strKommentar))
   Command.Parameters.Append(Command.CreateParameter("Skribent", adVarChar, adParamInput, 50, strSkribent))

   Call Command.Execute()

   strSQL = "SELECT @@IDENTITY"
   Set RecSet = Connect.Execute(strSQL)
   strSQL2 = "INSERT INTO tblKommentarBild (tblKommentarID, tblBildID) VALUES (?,?)"
   Command2.CommandText = strSQL2
   Command2.Parameters.Append(Command.CreateParameter("tblKommentarID", adVarChar, adParamInput, 50, RecSet(0)))
   Command2.Parameters.Append(Command.CreateParameter("tblBildID", adVarChar, adParamInput, 50, strBildID))
   Call Command2.Execute()
Medlem sedan aug. 20011 087 inlägg
#2

inget svar på din fråga men sätter du command till nothing efter din första command.execute så slipper du command2 command3 osv men tror du fortfarande får skapa det igen.

Medlem sedan dec. 20003 887 inlägg
#3

Nej, du behöver inte två Command objekt.

Att nollställa... när man har en select query och skickar resultatet till ett recordset, så tas parametrarna på objektet bort när recordsetet stängs. Jag vet inte vad som händer i ditt fall, men det kan ju rekommenderas att ta bort dom gamla innan du lägger till nya.

Command.Parameters.Delete "Datum"
Command.Parameters.Delete "Kommentaren"
Command.Parameters.Delete "Skribent"

Jag föreslår att du testar lite olika. :)

Medlem sedan maj 20031 173 inlägg
#4

Det fungerade fint att ta bort de gamla och lägga till nya. Tror ni att det är bättre att göra så än att skapa fler command objekt?

Jag lägger ju även till en SQL-sträng med kommandot:
Command.CommandText = strSQL
men det verkar inte som jag behöver göra något åt det, fungerade fint att bara skriva en ny SQL-sträng och skriva det där kommandot igen. verkar som det skriver över det tidigare. någon som kan förklara varför?

och tillslut, både RecordSet och Connections kan man stänga, men jag hittar inte någonstans hur man avslutar ett command-object. vad ska man göra med det när man inte använder det längre?

TACK!

Medlem sedan juni 2004533 inlägg
#5

Calevan skrev:

Det fungerade fint att ta bort de gamla och lägga till nya. Tror ni att det är bättre att göra så än att skapa fler command objekt?

Jag tror att det är effektivare ifall du tar bort Command-objektet och skapar ett nytt. Objektet kommer då att hamna i objekt-poolen, och det är samma objekt som du återanvänder, men helt tömt.

Calevan skrev:

Jag lägger ju även till en SQL-sträng med kommandot:
Command.CommandText = strSQL
men det verkar inte som jag behöver göra något åt det, fungerade fint att bara skriva en ny SQL-sträng och skriva det där kommandot igen. verkar som det skriver över det tidigare. någon som kan förklara varför?

I samlingen Parameters så lägger du ju till parameter-objekt, men i egenskapen CommandText så lägger du ju bara in ett värde. Det fungerar precis som en vanlig variabel, egenskapen kan bara ha ett värde i taget, alltså ersätts det tidigare värdet.

Calevan skrev:

och tillslut, både RecordSet och Connections kan man stänga, men jag hittar inte någonstans hur man avslutar ett command-object. vad ska man göra med det när man inte använder det längre?

Sätt Command.ActiveConnection till Empty och sätt referensen Command till Empty.

Medlem sedan maj 20031 173 inlägg
#6

Guffa skrev:

Calevan skrev:

Det fungerade fint att ta bort de gamla och lägga till nya. Tror ni att det är bättre att göra så än att skapa fler command objekt?

Jag tror att det är effektivare ifall du tar bort Command-objektet och skapar ett nytt. Objektet kommer då att hamna i objekt-poolen, och det är samma objekt som du återanvänder, men helt tömt.

är det altså såhär du menar att man kan göra om man vill skapa två recordsets:

  Set Command = server.createobject("ADODB.Command")
  Command.ActiveConnection = Connect
  strSQL =  "SELECT..."
  Command.CommandText = strSQL
  Command.Parameters.Append(Command.CreateParameter("BildID", adVarChar, adParamInput, 50, strBildID))
  Command.Parameters.Append(Command.CreateParameter("AnvID", adVarChar, adParamInput, 50, strUserId))
  Set RecSet = Command.Execute()

  Command.ActiveConnection = Nothing

  Set Command = server.createobject("ADODB.Command")
  Command.ActiveConnection = Connect
  strSQL =  "SELECT..."
  Command.CommandText = strSQL
  Command.Parameters.Append(Command.CreateParameter("BildID", adVarChar, adParamInput, 50, strBildID))
  Command.Parameters.Append(Command.CreateParameter("AnvID", adVarChar, adParamInput, 50, strUserId))
  Set RecSet2 = Command.Execute()

det fungerar, men jag vet inte om det var så du menar.

Guffa skrev:

Calevan skrev:

och tillslut, både RecordSet och Connections kan man stänga, men jag hittar inte någonstans hur man avslutar ett command-object. vad ska man göra med det när man inte använder det längre?

Sätt Command.ActiveConnection till Empty och sätt referensen Command till Empty.

hittar inget kommando som heter Empty, är det Nothing du menar dvs, Command.ActiveConnection = Nothing som jag skrev i ovan eller har jag missat något?

tack för ditt tålamod! :birp

Medlem sedan juni 2004533 inlägg
#7

Ja, det var så jag menade. Du har dock glömt några Set:

Set Command.ActiveConnection = Connect
Set Command.ActiveConnection = Nothing

Ifall du inte har Set på den första så kommer du bara att lägga in Connection-objektets uppkopplingssträng i Command-objektet. Därmed kommer den att göra en ny uppkoppling mot databasen när varje fråga körs, vilket är lite onödigt när du redan har en uppkoppling.

Glöm inte att avreferera Command-objektet innan du skapar ett nytt:

Set Command = Nothing

Annars kommer objektet inte att ligga i objekt-poolen när du skapar det nya objektet. Då måste den skapa ett helt nytt objekt, vilket tar mycket längre tid än att återanvända ett objekt.

Naturligtvis var det Nothing jag menade, inte Empty. (Dock finns även värdet Empty, det är det värde som alla variabler har innan man tilldelat dem något värde, och man kan också tilldela variabler värdet Empty.)

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