Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[ASP.NET4 C#] Optionele paramter bij SQL parameterized query

Pagina: 1
Acties:

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 17-11 00:43
Volgens mij kan het niet, ik heb al goed gezocht, maar toch een poging of hier iemand het definitieve antwoord kan geven:

C#:
1
2
3
4
5
6
7
dbcomm = new SqlCommand("UPDATE users SET usr_username = @usr_username, usr_hash = @usr_hash, usr_firstname = @usr_firstname WHERE usr_uid = @usr_uid;", dbconn);

[...]
dbcomm.Parameters.Add("@usr_username", System.Data.SqlDbType.VarChar, 33);
dbcomm.Parameters["@usr_username"].Value = Request.Form["usr_username"].ToString().Trim());
dbcomm.Parameters.Add("@usr_hash", System.Data.SqlDbType.VarChar, 128);
[...]


Ik weet dat ik een value op NULL kan zetten met DBNull.value. Maar de vraag is, wanneer geen nieuw wachtwoord wordt gekozen door de gebruiker wil ik die niet updaten. Kan ik de waarde die in de database zit dus behouden? Zonder bijv een apart SQL query te configureren waarin deze parameter niet zit?

Ik wil dus iets doen als:

C#:
1
2
3
4
if (Request.Form["action"] == "edit" && Request.Form["usr_password"].ToString().Length == 0)
    dbcomm.Parameters["@usr_hash"].Value = <<houd waarde hetzelfde>>;
else
    dbcomm.Parameters["@usr_hash"].Value = Hash.Hash.GetHash(Request.Form["usr_password"].ToString().Trim(), Hash.Hash.HashType.SHA512);

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarom niet gewoon twee verschillende queries? Één waarbij je het password wel update, en één waarbij je die niet meeneemt.

Een andere truc die vaak wordt toegepast is in je query het volgende opnemen

SQL:
1
UPDATE ... SET usr_hash = COALESCE( @usr_hash, usr_hash ) ...

Als @usr_hash dan null is word de waarde van usr_hash gewoon gepakt.

[ Voor 48% gewijzigd door Woy op 14-12-2012 15:15 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 20-11 12:23

edeboeck

mie noow noooothing ...

De optie die Woy hierboven aanhaalt lijkt me degelijk. Als je alsnog met 1 query aan de slag wilt, kan je misschien iets gebruiken als:
SQL:
1
2
UPDATE users
SET usr_username = @usr_username, usr_hash = ISNULL(@usr_hash, usr_hash), usr_firstname = @usr_firstname WHERE usr_uid = @usr_uid;
Belangrijk is dan wel om voor de parameter @usr_hash DbNull door te geven.
Btw: wel best eerst even testen :+

Edit: intussen heeft Woy zijn post al aangepast met een voorbeeld voor 1 query...
off-topic: Woy: Code=sql geeft geen syntax-coloring (ook niet met mysql), wat heb jij gebruikt?Komt ervan als je "quote" typt ipv "code" 8)7

Edit2: Voor verschil tussen ISNULL en COALESCE:
ISNULL and COALESCE though equivalent, can behave differently. An expression involving ISNULL with non-null parameters is considered to be NOT NULL, while expressions involving COALESCE with non-null parameters is considered to be NULL.
IsNull geeft steeds het gegevenstype terug van de eerste parameter

[ Voor 47% gewijzigd door edeboeck op 14-12-2012 15:23 . Reden: aanpassing Woy + extra info IsNull/Coalesce ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
edeboeck schreef op vrijdag 14 december 2012 @ 15:18:
off-topic: Woy: Code=sql geeft geen syntax-coloring (ook niet met mysql), wat heb jij gebruikt?
Gewoon [code=sql]sql code[/]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 17-11 00:43
Woy schreef op vrijdag 14 december 2012 @ 15:13:
Waarom niet gewoon twee verschillende queries? Één waarbij je het password wel update, en één waarbij je die niet meeneemt.

Een andere truc die vaak wordt toegepast is in je query het volgende opnemen

SQL:
1
UPDATE ... SET usr_hash = COALESCE( @usr_hash, usr_hash ) ...

Als @usr_hash dan null is word de waarde van usr_hash gewoon gepakt.
Oh ja, thanks! Volgens mij heb ik COALESCE zelfs bij een vorige web app gebruikt voor dit probleem. Opeens wordt het weer helder ;-) :*)