Avatar billede s0mmer Nybegynder
03. januar 2009 - 01:14 Der er 6 kommentarer og
1 løsning

Fra Recordset til Command

Hej eksperter,

Softspot har før hjulpet mig igang med command objektet og spørgsmålet er mest til ham, men andre må selvfølgelig også svare. Jeg står og ska lave en masse connections fra recordsets til commands. Eks denne:

set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=SQLOLEDB;Data Source=xx;Initial Catalog=xx;xxId=xx;Password=xx;"
set rs = CreateObject("ADODB.Recordset")
set rsstamdata = CreateObject("ADODB.Recordset")

If Request("B1") <> "" Then
Selskaber = Trim(Request("selskab"))

If magazine <> "" Then

Conn.Execute ("UPDATE Customers SET Alert = '" & Selskaber & "' WHERE ID = " & Session("Var_to_no_use"))

Hvordan ville man lave den om til at bruge command objektet?
Avatar billede softspot Forsker
03. januar 2009 - 03:19 #1
Jeg er nu ikke helt sikker på, at jeg forstår din opgave, men såvidt jeg kan se er der basis for ét commandobjekt, nemlig der hvor du kalder Conn.Execute. Jeg kunne dog godt tænke mig at høre lidt mere om hvad det er du vil opnå, for det er lidt kryptisk formuleret i spørgsmålet (eller måske er jeg bare for træt til at læse dit budskab ;-))...
Avatar billede s0mmer Nybegynder
03. januar 2009 - 10:26 #2
softspot > Overordnet set ønsker jeg at stoppe alle steder hvor der kunne forebygge sql injections. Det her er et sted hvor jeg umiddelbart mener der kunne forekomme et pga UPDATE Customers SET Alert = '" & Selskaber & "' WHERE ID = " & Session("Var_to_no_use"), men tager jeg fejl?

Men ihvertfald, derfor ønsker jeg at lave flg. kode om til at bruge command objektet ligesom vi har gjort andre steder i min kode.
Avatar billede softspot Forsker
03. januar 2009 - 11:42 #3
Jamen i så fald kan opskriften være som foreskrevet i artiklen "Parameterisering af databasekald med ASP og ADO": http://www.eksperten.dk/artikler/1250

Det vil sige i dit konkrete tilfælde skal linien

Conn.Execute ("UPDATE Customers SET Alert = '" & Selskaber & "' WHERE ID = " & Session("Var_to_no_use"))

udskiftes med noget i stil med:

sql = "UPDATE Customers SET Alert = ? WHERE ID = ?"

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = Conn
cmd.CommandText = sql
cmd.CommandType = adCmdText
cmd.Parameters.Append cmd.CreateParameter("@alert", adVarChar, adParamInput, 255, Selskaber)
cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, adParamInput, 4, Session("Var_to_no_use"))

recordCount = 0
cmd.Execute recordCount
if recordCount = 1 then
  response.write "Oplysningerne er nu gemt."
else
  response.write "Oplysningerne blev IKKE gemt. Forsøg evt. igen eller kontakt support."
end if
Avatar billede softspot Forsker
03. januar 2009 - 11:59 #4
Du kan gøre oprettelsen af commandobjektet kodemæssigt lidt mere læsbart ved at pakke den ind i en funktion som kan kaldes med lidt parametre. Denne kan så genbruges de steder hvor dette måtte være relevant:

function getTextCommandConn(sql,conn)
  dim cmd
  set cmd = Server.CreateObject("ADODB.Command")
  set cmd.ActiveConnection = conn
  cmd.CommandText = sql
  cmd.CommandType = adCmdText
  set getTextCommandConn = cmd
end function


Denne kaldes så i eksemplet fra 03/01-2009 11:42:42 således:

sql = "UPDATE Customers SET Alert = ? WHERE ID = ?"

set cmd = getTextCommandConn(sql,Conn)
cmd.Parameters.Append cmd.CreateParameter("@alert", adVarChar, adParamInput, 255, Selskaber)
cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, adParamInput, 4, Session("Var_to_no_use"))

recordCount = 0
cmd.Execute recordCount
if recordCount = 1 then
  response.write "Oplysningerne er nu gemt."
else
  response.write "Oplysningerne blev IKKE gemt. Forsøg evt. igen eller kontakt support."
end if

Hvis du placerer funktionen strategisk fornuftigt, kan den naturligvis genbruges mange andre steder og dermed blive rigtig nyttig til at slanke din kode lidt og gøre den mere læsbar.
Avatar billede s0mmer Nybegynder
03. januar 2009 - 13:57 #5
softspot > send svar og du får points. et enkelt (dumt) spg: jeg kan vel fint udelade din if sætning nederst som fortæller om der er gemt eller ej?. Vil helst ikke tilføje nye ting til koden. Men mange tak for hjælpen :)
Avatar billede softspot Forsker
03. januar 2009 - 14:06 #6
Naturligvis, if-sætningen var blot for at illustrere, hvordan man kunne bruge recordCount til at validere/sandsynliggøre at kaldet var udført korrekt... :-)

NB: Du kan også undlade recordCount hvis du ikke benytter den til noget og dermed få flg. kode:

sql = "UPDATE Customers SET Alert = ? WHERE ID = ?"

set cmd = getTextCommandConn(sql,Conn)
cmd.Parameters.Append cmd.CreateParameter("@alert", adVarChar, adParamInput, 255, Selskaber)
cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, adParamInput, 4, Session("Var_to_no_use"))

cmd.Execute
Avatar billede softspot Forsker
05. januar 2009 - 22:45 #7
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester