[sql]Like query met parameters in een asp.net applicatie

Pagina: 1
Acties:

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10:26
Stel je de volgende query voor:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
declare @nummer decimal
SET @nummer=1234
declare @naam nvarchar(200)
SET @naam='%meuk%'
select 
    Postcode 
from 
    tbl_postcodes

    where 

    lidnummer = @nummer 
    and 
    Naam like @naam

Deze heb ik in de Query analyzer uitgevoerd, en ik krijg netjes een resultaat.

Wil ik deze query echter in een asp.net applicatie gebruiken met onderstaande code
C#:
1
2
3
4
5
6
7
string SQL = "select Postcode from tbl_postcodes where " 
    +"lidnummer = @nummer and Naam like @naam";
SqlCommand comm = new SqlCommand(SQL, conn);
comm.Parameters.Add("@nummer", SqlDbType.Decimal);
comm.Parameters["@nummer"].Value = 1234;
comm.Parameters.Add("@naam", SqlDbType.NVarChar,200);
comm.Parameters["@naam"].Value = "'%meuk%'";
dan krijg ik geen resultaat als ik
C#:
1
Debug.WriteLine("Exec: " +comm.ExecuteNonQuery());
gebruik. In mijn debug schermpje wordt netjes "Exec: -1" afgedrukt.

Er wordt ook geen exception gegooid. Ik heb het idiote idee dat ik iets over het hoofd zie, alleen, je raadt het al, zie ik het niet.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Geen ervaring hiermee, maar ik zou vermoeden dat je enkele quotjes in je SQL string moeten komen ipv. in de parameter. Dus like '@naam'

Who is John Galt?


  • lier
  • Registratie: Januari 2004
  • Laatst online: 09:54

lier

MikroTik nerd

Waarom maak je niet "gewoon" een stored procedure waaraan je de parameters mee geeft ?
Kan je trouwens nog wat meer code geven ?

Eerst het probleem, dan de oplossing


Verwijderd

Waarom roep je de ExecuteNonQuery() functie aan, die is toch bedoeld voor INSERT, UPDATE en DELETE statements?

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10:26
Zo, dat ging even sneller dan verwacht.
justmental schreef op woensdag 31 januari 2007 @ 16:18:
Geen ervaring hiermee, maar ik zou vermoeden dat je enkele quotjes in je SQL string moeten komen ipv. in de parameter. Dus like '@naam'
comm.Parameters["@naam"].Value = "'%meuk%'"; Die staan er dus bij ;) Als je het eerste stukje SQL ziet, dan hoeft het daar ook niet.
lier schreef op woensdag 31 januari 2007 @ 16:18:
Waarom maak je niet "gewoon" een stored procedure waaraan je de parameters mee geeft ?
Kan je trouwens nog wat meer code geven ?
"Gewoon" een stored procedure maken is geen optie. (Closed db gedoe e.d.)
Hoezo meer code? Lijkt me dat dit prima relevante code is.
Verwijderd schreef op woensdag 31 januari 2007 @ 16:18:
Waarom roep je de ExecuteNonQuery() functie aan, die is toch bedoeld voor INSERT, UPDATE en DELETE statements?
Je hebt gelijk.
Gebruik ik:
C#:
1
2
3
4
5
6
7
            IDataReader idr = comm.ExecuteReader();
            while (idr.Read())
            {
                System.Diagnostics.Debug.WriteLine("1: " + idr["lidnummer"]);
                System.Diagnostics.Debug.WriteLine("2: " + idr["Naam"]);
                System.Diagnostics.Debug.WriteLine("3: " + idr["PostCode"]);
            }

Dan krijg ik een exception dat er geen data present is.

Verherbouw ik de query naar
SQL:
1
2
select postcode from tbl_postcodes where 
lidnummer = "+nummer+" and Naam like '%"+naam+"%'
dan krijg ik wel netjes een postcode. Alleen "mag" dat niet ivm SQL injection.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • lier
  • Registratie: Januari 2004
  • Laatst online: 09:54

lier

MikroTik nerd

Waarom geef je de parameters eigenlijk als...parameters mee ?
Je bouwt een SQL string op, hierin kan je toch gelijk ook de parameters opnemen ?

Eerst het probleem, dan de oplossing


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10:26
lier schreef op woensdag 31 januari 2007 @ 16:24:
Waarom geef je de parameters eigenlijk als...parameters mee ?
Je bouwt een SQL string op, hierin kan je toch gelijk ook de parameters opnemen ?
Hoe bedoel je dat? Omdat de Parameter.Values al gevuld zijn met 1234 en meuk? Om uit te sluiten dat het niet aan de ingevulde waardes uit een webform ligt. Zeg maar een testcase welke overeenkomt met de werkende query uit de Query analyzer.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • lier
  • Registratie: Januari 2004
  • Laatst online: 09:54

lier

MikroTik nerd

Ik bedoel eigenlijk meer zoiets:

string pLidNummer = "1234";
string pNaam = "meuk";

string SQL = "select Postcode from tbl_postcodes where "
+"lidnummer = " + pLidNummer + "AND Naam like '%" + pNaam + "'";

Eerst het probleem, dan de oplossing


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10:26

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Zoals eerder al gezegd: niet ExecuteNonQuery gebruiken.
Waarom zet je ook quotes in je parameter value ? Dat mag je helemaal niet doen.

Zo dus:
code:
1
command.Parameters["@naam"].Value = "%bliep%";

ipv
code:
1
command.Parameters["@naam"].Value = "'%bliep%'";

[ Voor 33% gewijzigd door whoami op 31-01-2007 16:52 ]

https://fgheysels.github.io/


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10:26
whoami schreef op woensdag 31 januari 2007 @ 16:51:
Zoals eerder al gezegd: niet ExecuteNonQuery gebruiken.
Zo ver was ik inderdaad ook al ;)
Waarom zet je ook quotes in je parameter value ? Dat mag je helemaal niet doen.

Zo dus:
code:
1
command.Parameters["@naam"].Value = "%bliep%";

ipv
code:
1
command.Parameters["@naam"].Value = "'%bliep%'";
In mijn startpost zie je een query die prima werkt in Query Analyzer.
Verander ik de @naam parameter in %meuk%, zoals jij zegt, dan krijg ik netjes
code:
1
2
Server: Msg 170, Level 15, State 1, Line 4
Line 4: Incorrect syntax near 'meuk'.

terug.

Zoals eerder gezegd: als ik de query verherbouw naar
SQL:
1
2
select postcode from tbl_postcodes where 
lidnummer = 1234 and Naam like '%meuk%'

krijg ik netjes een postcode te zien.

[ Voor 12% gewijzigd door TeeDee op 01-02-2007 09:00 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
n mijn startpost zie je een query die prima werkt in Query Analyzer.
Verander ik de @naam parameter in %meuk%, zoals jij zegt, dan krijg ik netjes
Je moet je parameter niet hernoemen, je moet de waarde van die parameter zo opvullen.
code:
1
2
3
4
string sqlQuery = "select postcode from tbl_postcodes where naam like @p_naam";
SqlCommand cmd = new SqlCommand();
cmd.CommandText = sqlQuery;
cmd.Parameters.Add ("@p_naam", SqlDbType.Varchar).Value = "%meuk%";

https://fgheysels.github.io/


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10:26
whoami schreef op donderdag 01 februari 2007 @ 09:02:
[...]
Je moet je parameter niet hernoemen, je moet de waarde van die parameter zo opvullen.
Ja stom, de parameter value bedoel ik. (tis nog vroeg).
code:
1
2
3
4
string sqlQuery = "select postcode from tbl_postcodes where naam like @p_naam";
SqlCommand cmd = new SqlCommand();
cmd.CommandText = sqlQuery;
cmd.Parameters.Add ("@p_naam", SqlDbType.Varchar).Value = "%meuk%";
Nu begrijp ik het. Ik zat de hele tijd te testen in de QA en niet mijn app. Het werkt nu perfect. Toch nog een beetje het automatisme om er een quote omheen te zetten.
Helemaal geweldig.

Heart..pumps blood.Has nothing to do with emotion! Bored

Pagina: 1