[sql] parametrized UPDATE?

Pagina: 1
Acties:

  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
*** lees even verder naar onder, daar staat namelijk een nieuwe vraag over booleans ***


in onderste reply heb ik een nieuwe vraag (over meerdere waardes in request.form)

'allo alloah ..
weer eens even een vraagje over parametrized query's:

Parametrized query's gebruikt men over het algemeen om data in
databases te INSERT-en .. maar hoe zit dat met UPDATE commando's ?
Is in dat geval parame.. (ja dat dus) dan ook aan te raden of is het zelfs
onmogelijk?

De reden voor deze vraag is als volgt:

SQL:
1
2
3
strSQL = "UPDATE Bericht SET Titel = "& Request.Form("Title") &", TitelColor = "& Request.Form("TitleColor") &", TitelBgr = '', TitelFont = '', TitelSize = '', Msg = '', MsgColor = '', MsgBgr = '', MsgPos = '', MsgFont = '', MsgSize = '', Duration = '' WHERE ID = "& Request.Form("id")

<!-- waar nu nog ''  staat komt dus ook Request.Form("****") -->


als ik dit helemaal uit ga vullen wordt dat een drama lijkt mij ;)
Dus vandaar de vraag moet ik dit niet parametrized gaan maken ofzo?

offtopic:
Ik heb netjes eerst de forum faq doorgelezen, daar heb ik het niet kunnen
vinden en ook 4guysfromrolla zag ik er niets over staan. :?

[ Voor 75% gewijzigd door intrix op 16-04-2004 17:04 ]

welcome my son, welcome to the machine


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Ja, je moet 'm parametrized maken. Gewoon al om injection tegen te gaan.
Stel je voor dat je als titel dit in geeft:
code:
1
'';DROP TABLE bericht;--

Iedere query (insert, update, delete, select) is parametrized te maken.

https://fgheysels.github.io/


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
whoami schreef op 05 april 2004 @ 12:26:
Ja, je moet 'm parametrized maken. Gewoon al om injection tegen te gaan.
Stel je voor dat je als titel dit in geeft:
code:
1
'';DROP TABLE bericht;--

Iedere query (insert, update, delete, select) is parametrized te maken.
Ok, weer aan de slag dan maar! Zijn er nog dingen waar je op moet letten
in het geval van een para-UPDATE-query? Oftewel zijn er nog grote wijzigingen
ten opzien van de standaard (de voor mij bekende bedoel ik dan = INSERT INTO) query ?

Antwoord is ja natuurlijk .. logisch (sorry!)

zou dat dan zoiets worden ? ->

SQL:
1
2
3
4
5
6
7
8
9
10
11
strSQL = "UPDATE Bericht SET Titel = ?, TitelColor = ?, etcetera WHERE ID = ?"
  cmdUpdate.ActiveConnection = strConnect
  cmdUpdate.CommandText = strSQL
  cmdUpdate.CommandType = adCmdText
Response.Write strSQL & "<br><br>"
   Set objParam = cmdUpdate.CreateParameter("@Title", adVarChar, adParamInput, 100, Request.Form("Title"))
   cmdUpdate.Parameters.Append objParam
   Set objParam = cmdUpdate.CreateParameter("@TitleColor", adVarChar, adParamInput, 7, Request.Form("TitleColor"))

   cmdUpdate.Parameters.Append objParam
 cmdUpdate.Execute


offtopic:
is jouw favo onderwerp is het niet? :)

[ Voor 49% gewijzigd door intrix op 05-04-2004 12:33 ]

welcome my son, welcome to the machine


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Parametrized queries in een update query, is net hetzelfde als in een insert/delete of select query.
Het principe blijft hetzelfde. Je definieert ahw een 'placeholder' in je SQL statement, en je geeft dan aan door wat die placeholder moet vervangen worden.
Aan de hand van het type variabele die erin moet komen (en dat moet je zelf definieren bij het definieren van je parameters), wordt er bepaald of er quotes enzo moeten rondkomen.

offtopic:
Je kunt zeggen dat het een stokpaardje van me is ja.
Als je eens een boel code hebt moeten doorspitten waar overal SQL queries stonden, en er werd geen gebruik gemaakt van parametrized queries, dan ga je daar nogal voor pleiten ja.

https://fgheysels.github.io/


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
dat kan een stukje efficienter hoor...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
dim sqlquery
    sqlquery = "SELECT id, foo FROM tbl_foo WHERE id=? AND foo=?;"
    
With objCom
  .ActiveConnection     = objCon
  .CommandText      = sqlquery      
  .CommandType      = adCmdText     
        
    .Parameters.Append .CreateParameter("@id", adInteger, adParamInput, 4, intID)
    .Parameters.Append .CreateParameter("@foo", adVarWChar, adParamInput, 4, strFoo)

  .Execute  
End With

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
whoami schreef op 05 april 2004 @ 12:34:
Parametrized queries in een update query, is net hetzelfde als in een insert/delete of select query.
Het principe blijft hetzelfde. Je definieert ahw een 'placeholder' in je SQL statement, en je geeft dan aan door wat die placeholder moet vervangen worden.
Aan de hand van het type variabele die erin moet komen (en dat moet je zelf definieren bij het definieren van je parameters), wordt er bepaald of er quotes enzo moeten rondkomen.
Ja ok dus dan zet je die placeholders dus op de plek
waar je normaal de input zou plaatsen. Vraagtekens dus daar waar er
een variabele moet komen .. volgens mij ben ik dan met de code in het
eerdere bericht .. ' op weg '

moet er voor de rest niets veranderen aan dingen zoals adParamInput ?

welcome my son, welcome to the machine


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
faabman schreef op 05 april 2004 @ 12:42:
[...]


dat kan een stukje efficienter hoor...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
dim sqlquery
    sqlquery = "SELECT id, foo FROM tbl_foo WHERE id=? AND foo=?;"
    
With objCom
  .ActiveConnection     = objCon
  .CommandText      = sqlquery      
  .CommandType      = adCmdText     
        
    .Parameters.Append .CreateParameter("@id", adInteger, adParamInput, 4, intID)
    .Parameters.Append .CreateParameter("@foo", adVarWChar, adParamInput, 4, strFoo)

  .Execute  
End With
Ok dit is en staandaard voorbeeld van een parametrized SELECT query?
Met iets mooier geformuleerde regels .. maar voor de rest doet het toch het zelfde?
of zie ik dat totaal verkeerd :?

't is wel vet overzichterlijker weer :)

[ Voor 6% gewijzigd door intrix op 05-04-2004 12:47 ]

welcome my son, welcome to the machine


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
Hieronder even wat ik er tot nu toe van gebakken heb,
als dit correct is denk ik dat ik eindelijk echt begrijp hoe parametrized werkt.
Voorheen bleef ik stiekem stijf aan mijn werkende voorbeeld plakken ..

offtopic:
waar is die smile die zich kapot schaamt en zich een neppert voelt


SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Set cmdUpdate = Server.CreateObject("ADODB.Command")

strSQL = "UPDATE Bericht SET Titel = ?, TitelColor = ?, TitelBgr = ?, TitelFont = ?, TitelSize = ?, Msg = ?, MsgColor = ?, MsgBgr = ?, MsgPos = ?, MsgFont = ?, MsgSize = ?, Duration = ? WHERE ID = ?"

With cmdUpdate
  .ActiveConnection = strConnect
  .CommandText      = strSQL        
  .CommandType      = adCmdText

  .Parameters.Append .CreateParameter("@Title", adVarChar, adParamInput, 100, Request.Form("Title"))
  .Parameters.Append .CreateParameter("@TitleColor", adVarChar, adParamInput, 7, Request.Form("TitleColor"))
  .Parameters.Append .CreateParameter("@TitleBgr", adVarChar, adParamInput, 7, Request.Form("TitleBgr"))
  .Parameters.Append .CreateParameter("@TitelFont", adVarChar, adParamInput, 100, Request.Form("TitleFont"))
  .Parameters.Append .CreateParameter("@TitelSize", adInteger, adParamInput, 7, Request.Form("TitleSize"))

  .Parameters.Append .CreateParameter("@Msg", adLongVarChar, adParamInput, 8000, Request.Form("Msg"))
  .Parameters.Append .CreateParameter("@MsgColor", adVarChar, adParamInput, 7, Request.Form("MsgColor"))
  .Parameters.Append .CreateParameter("@MsgBgr", adVarChar, adParamInput, 7, Request.Form("MsgBgr"))
  .Parameters.Append .CreateParameter("@MsgPos", adVarChar, adParamInput, 7, Request.Form("MsgPos"))
  .Parameters.Append .CreateParameter("@MsgFont", adVarChar, adParamInput, 100, Request.Form("MsgFont"))
  .Parameters.Append .CreateParameter("@MsgSize", adInteger, adParamInput, 7, Request.Form("MsgSize"))

  .Parameters.Append .CreateParameter("@Duration", adInteger, adParamInput, 7, Request.Form("Duration"))

  .Parameters.Append .CreateParameter("@Id", adInteger, adParamInput, 7, Request.Form("id"))

  .Execute    
End With

welcome my son, welcome to the machine


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
mag ik je aanraden om de integers nog wel ff af te checken voordat je ze in je query gooit, datatype errors staan zo lelijk ;)

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
faabman schreef op 05 april 2004 @ 13:57:
mag ik je aanraden om de integers nog wel ff af te checken voordat je ze in je query gooit, datatype errors staan zo lelijk ;)
eh, volgens mij werkt ie nu, de enige error die ik volgens mij kreeg
was een error met betrekking tot een parameter die niet meer
voor kwam in de database .. maar das dus niet van toepassing op dit verhaal.

even iets anders .. datums .. dat blijf ik een ramp vinden hoe doe ik dat nou?!

SQL:
1
2
3
strSQL = "DELETE FROM datum WHERE datum.bericht_id = ? AND datum.bericht_datum = ?"

.Parameters.Append .CreateParameter("@datum", adDBTimeStamp, adParamInput, 101, Request.Form("datum"))


(heb ik gelijk nog een probleem met betrekking tot deze situatie maar dat heeft
niet zozeer met SQL te maken; had het geniale idee een checkbox achter een
veld te kwakken zo van DELETE dit bericht, maar de ' unieke sleutel' in mijn
db is bericht_id + bericht_datum ... dus dan moet die checkbox 2 values mee
krijgen .. !? maar dat kan toch helemaal niet?! ..

o ja en probleem 2 .. weet niet of dat een echt probleem is maar eh ..
als je nou 30 berichten selecteerd en POST .. wat doet mijn asp / sql daar dan
mee? loopt die ze een voor een door of moet ik dat zelf afvangen?)

welcome my son, welcome to the machine


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
Ok inzake meerdere checkboxes aangevinkt:
ik maak een lijst van checkboxen als volgt ik schrijf voor elke
rij in de database een checkbox ..
Visual Basic .NET:
1
Response.Write "<input type=""checkbox"" name=""Id"" value="""& arrMsg(0,tel) & """>"


vervolgens klik ik er drie of vier aan .. dan krijg ik dus mijn sql gedeelte die
het af moet handelen in eerste instantie gebruikte ik WHERE id = maar
dat werkt uiteraard niet bij meerdere nummers dus mijn code is nu
als volgt:

VBScript:
1
2
3
4
5
6
7
8
9
10
11
 strSQL = "DELETE FROM Bericht WHERE ID IN (?)"

 With cmdUpdate
   .ActiveConnection = strConnect
   .CommandText      = strSQL        
   .CommandType      = adCmdText

   .Parameters.Append .CreateParameter("@Id", adInteger, adParamInput, 100, Request.Form("Id"))

   .Execute    
 End With


Maar jammer genoeg werkt dit niet, als ik 1 checkbox aan klik werkt het wel
maar zodra ik meerdere selecteer krijg ik het volgende:

code:
1
2
3
4
5
ADODB.Command error '800a0d5d' 

Application uses a value of the wrong type for the current operation. 

/intrascripts/lichtkrant/updatemsg.asp, line 25


wat doe ik precies fout dan want ik kan het niet vinden?!
volgens mij zit het in het feit dat mijn parametrized ding niet meer klopt
adInteger accepteerd het feit dat er nu een comma in zit niet ofzo?

als ik een advarchar er van maak krijg ik geen error, maar werken doet het ook niet

probleem zit 'm d'r in dat Request.Form("id") = 213, 211, 214 niet aangenomen wordt (door SQL ?) .. weet iemand hoe ik dat op moet lossen?!

als ik het met adInteger doe dan zegt mijn parametrized dat het fout is omdat
ik een comma of wat in mijn zogenaamde 'integer' wil zetten .. zodra ik er een
advarchar van maak krijg ik geen error maar SQL voer ook gewoon niets uit ..

wat is volgens u allen de oplossing .. heeft iemand dit wel eens meegemaakt?

[ Voor 55% gewijzigd door intrix op 06-04-2004 10:33 ]

welcome my son, welcome to the machine


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Tja, dat is best logisch.
Je definieert je parameter als een integer type, en dan geef je er een string aan mee.
Als je je parameter als een string definieert, dan worden er quotes rond die nummer-sequence gezet, en dan werkt het idd ook niet zoals het moet.

Je zult die query ofwel:
- voor ieder ID apart moeten aanroepen met een parametrized query
- ofwel zal je -in dit geval dan- geen gebruik moeten maken van parametrized queries.

https://fgheysels.github.io/


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
whoami schreef op 06 april 2004 @ 11:47:
Tja, dat is best logisch.
Je definieert je parameter als een integer type, en dan geef je er een string aan mee.
Als je je parameter als een string definieert, dan worden er quotes rond die nummer-sequence gezet, en dan werkt het idd ook niet zoals het moet.

Je zult die query ofwel:
- voor ieder ID apart moeten aanroepen met een parametrized query
- ofwel zal je -in dit geval dan- geen gebruik moeten maken van parametrized queries.
?! nou ja zeg .. dat is balen .. !? 8)7 8)7

voor iedere id opnieuw die query aanroepen vind ik een rotgedoe .. dus
dan moet het (terwijl ik net alle query's omgebouwd heb naar para..) nu maar
zonder doen :S 8)7 |:( :'(

welcome my son, welcome to the machine


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
Ik reageer maar weer in dit topic, aangezien het toch ook weer te maken heeft
met parametrized query's ..

Hoe ga je om met booleans? Acces biedt de mogelijkheid om een 'yes/no' kolom aan te maken, daar kan ik dan vervolgens mijn boolean in storen

echter, hoe gebruik je die boolean in parametrized queries?

ik zie 'm namelijk niet in de DataType QuickRef staan die ik heb .. (adBigInt enzo)

Iemand bekend hiermee?

welcome my son, welcome to the machine


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:50

gorgi_19

Kruimeltjes zijn weer op :9

Staat er wel iets van Bit?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik quote even uit ADOVBS.inc:
Visual Basic:
1
Const adBoolean = 11


Volgens mij kun je die dus gebruiken.

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
intrix schreef op 16 april 2004 @ 17:07:
Ik reageer maar weer in dit topic, aangezien het toch ook weer te maken heeft
met parametrized query's ..

Hoe ga je om met booleans? Acces biedt de mogelijkheid om een 'yes/no' kolom aan te maken, daar kan ik dan vervolgens mijn boolean in storen

echter, hoe gebruik je die boolean in parametrized queries?

ik zie 'm namelijk niet in de DataType QuickRef staan die ik heb .. (adBigInt enzo)

Iemand bekend hiermee?
access doet hierin overigens wel een beetje vreemd... wanneer je je table namelijk vult met 0 (false) en 1 (true) dan wordt de 1 weergegeven als een -1

overigens staat hij in de DataType QuickRef onder de groep Special :)

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!

Pagina: 1