Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem prilikom detaljne pretrage Baze MSSQL - C#2005

[es] :: .NET :: .NET Desktop razvoj :: Problem prilikom detaljne pretrage Baze MSSQL - C#2005

Strane: 1 2

[ Pregleda: 6875 | Odgovora: 30 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

almisa
Misa Aleksic
Srbija

Član broj: 104495
Poruke: 59
213.244.197.*



Profil

icon Problem prilikom detaljne pretrage Baze MSSQL - C#200509.08.2006. u 17:26 - pre 215 meseci
Koristim stranu Pretraga.aspx na kojoj se nalaza polja za unos(TextBox, DropDownList isl.) u koja se upisuju kriterijumi (Vrsta, Velicina, Cena od, Cena do, Prodat ili ne ...) za pretragu nekog proizvoda.
Pritiskom da dugme "Prikazi" izvrsava se sledeci kod:

Response.Redirect("RezultatPretrage.aspx?Vrsta=" + strVrsta + "&Velicina=" + strVelicina);

(ima mnogo vise parametara ustvari, ali ovoliko je dovoljno zaobjasnjenje)

Na drugoj strani, RezultatPretrage.aspx nalazi se povezane SqlDataSource1 i GridView1 kontrola, pri cemu SqlDataSource1 ima popunjenje sledece parametre:

Name: Value:

Vrsta Request.QueryString("Vrsta")
Velicina Request.QueryString("Velicina")
.
.
.

Generise se sledeci Select upit:

SELECT [IDProizvoda], [Vrsta], [Velicina] ... FROM [Proizvodi] WHERE (([Vrsta] = @Vrsta) AND ([Velicina] = @Velicina) AND ... ))

Problem je sledeci:
Kada unesem sve parametre pretrage, kojih ime preko 10, sve radi ok,
cim neki od parametara izostavim, tj. ne popunim TextBox sa nekom vrednoscu, rezultat pretrage je uvek prazna GridView1 kontrola.
 
Odgovor na temu

Solution
Vladimir Stankovic
Solution software
Leskovac

Član broj: 46426
Poruke: 85
*.pat-pool.le.sbb.co.yu.

Sajt: www.zaljubise.net


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200509.08.2006. u 18:03 - pre 215 meseci
Pa dobijas praznu tabelu zato sto verovatno u bazi svaki red ima sve popunjene kolone. Ne vidim bas najbolje u cemu je problem jer ti prosto mozes da postavis IF pitanje da li je TextBox prazan i ako jeste da toj promenljivoj koju koristis kao parametar dodelis neku default vrednost.

Pozdrav,
Vladimir
www.zaljubise.net - najbolji sajt za upoznavanje
 
Odgovor na temu

Fedya
Fedor Hajdu
Solution Architect
Emaratech
Dubai, UAE

Član broj: 28246
Poruke: 790
*.ADSL.neobee.net.

Jabber: fedya@elitesecurity.org
Sajt: devtechgroup.com


+34 Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 08:10 - pre 215 meseci
Mozda je jos lakse da promenis upit u ...WHERE ((@Vrsta = "" OR [Vrsta] = @Vrsta) AND (@Velicina = "" OR [Velicina] = @Velicina) ...
i time ce svaki parametar koji nisi prosledio biti ignorisan.
Every hamster has his day.
 
Odgovor na temu

logic_rabbit
Radenko Zec
banjaluka

Član broj: 74458
Poruke: 271
87.250.108.*



+1 Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:14 - pre 215 meseci
Mozda je bolje da dinamicki pravis sql upit kao npr.
if !(Textbox1.text=="")
{
SqlUpit+="AND Vrsta="+@Vrsta
}
Znaci da dinamicki dodajes novi "AND" ako je textbox za unos pun.
logic_rabbit (MCAD,MCSD,MCT,MCTS-
Windows development,MCPD)
 
Odgovor na temu

Fedya
Fedor Hajdu
Solution Architect
Emaratech
Dubai, UAE

Član broj: 28246
Poruke: 790
*.ADSL.neobee.net.

Jabber: fedya@elitesecurity.org
Sajt: devtechgroup.com


+34 Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:23 - pre 215 meseci
Pa ne znam bas da je to bolje resenje, tako ima mnogo vise koda i mora da doda proveru da li mu tekst pocinje sa AND (tj. da li upit sadrzi WHERE AND pa to treba ispravljati...), mislim da je moje resenje bolje.
Every hamster has his day.
 
Odgovor na temu

VerbatimBOT
Aleksandar Dragosavac
Senior .NET Developer

Član broj: 84129
Poruke: 228
217.24.18.*



Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:29 - pre 215 meseci
Citat:
logic_rabbit: Mozda je bolje da dinamicki pravis sql upit kao npr.
if !(Textbox1.text=="")
{
SqlUpit+="AND Vrsta="+@Vrsta
}
Znaci da dinamicki dodajes novi "AND" ako je textbox za unos pun.


Ovo će sigurno raditi.

Citat:
Fedya: Pa ne znam bas da je to bolje resenje, tako ima mnogo vise koda i mora da doda proveru da li mu tekst pocinje sa AND (tj. da li upit sadrzi WHERE AND pa to treba ispravljati...), mislim da je moje resenje bolje.


Pa ovo je jedini način na koji možeš rešiti ovako nešto. Ja sam pokušavao na razne načine, ali tek kad se 100% udubiš u problem shvatiš da je ovo jedino rešenje.

Citat:
Fedya: Mozda je jos lakse da promenis upit u ...WHERE ((@Vrsta = "" OR [Vrsta] = @Vrsta) AND (@Velicina = "" OR [Velicina] = @Velicina) ...
i time ce svaki parametar koji nisi prosledio biti ignorisan.


U ovom slučaju bi izbacio rezultat i tamo gde nisu definisane vrsta i veličina, odnosno gde su prazan string, što nije u redu.
Winners never quit, quitters never win.
 
Odgovor na temu

Fedya
Fedor Hajdu
Solution Architect
Emaratech
Dubai, UAE

Član broj: 28246
Poruke: 790
*.ADSL.neobee.net.

Jabber: fedya@elitesecurity.org
Sajt: devtechgroup.com


+34 Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:32 - pre 215 meseci
Citat:
VerbatimBOT: U ovom slučaju bi izbacio rezultat i tamo gde nisu definisane vrsta i veličina što nije u redu.


Nisi dobro pogledao kod koji sam napisao, proveravam da li je parametar = "" a ne vrednost u tabeli. Znaci ako ima parametar uporedi ga sa vrednoscu u tabeli, ako nema ignorisi proveru!
Every hamster has his day.
 
Odgovor na temu

Fedya
Fedor Hajdu
Solution Architect
Emaratech
Dubai, UAE

Član broj: 28246
Poruke: 790
*.ADSL.neobee.net.

Jabber: fedya@elitesecurity.org
Sajt: devtechgroup.com


+34 Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:39 - pre 215 meseci
Sad sam video ovo:

Citat:
VerbatimBOT: Pa ovo je jedini način na koji možeš rešiti ovako nešto. Ja sam pokušavao na razne načine, ali tek kad se 100% udubiš u problem shvatiš da je ovo jedino rešenje.

LOL!

Ti se onda udubi 110%, jel ima jos nekoliko resenja kako mozes ovo reseti (preko dataseta, storovane...) ali je ovo moje najkrace i najlakse (kad ga shvatis)
Every hamster has his day.
 
Odgovor na temu

VerbatimBOT
Aleksandar Dragosavac
Senior .NET Developer

Član broj: 84129
Poruke: 228
217.24.18.*



Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:44 - pre 215 meseci
Citat:
Fedya: Nisi dobro pogledao kod koji sam napisao, proveravam da li je parametar = "" a ne vrednost u tabeli. Znaci ako ima parametar uporedi ga sa vrednoscu u tabeli, ako nema ignorisi proveru!
Citat:
Fedya: ...WHERE ((@Vrsta = "" OR [Vrsta] = @Vrsta) AND (@Velicina = "" OR [Velicina] = @Velicina) ...



Teoretski gledano, upit vraća rezultat gde je Vrsta jednaka praznom stringu ili parametru @Vrsta. Isto važi i za ostale parametre.
A drugo, nisam siguran koliko bi to radilo ako mu ne proslediš parametar, jer u tom slučaju parametar dobija vrednost NULL...
Ja ne vidim nikakvu IF proveru ovde...? Niti da si objasnio kako bi to implementirao?
Winners never quit, quitters never win.
 
Odgovor na temu

VerbatimBOT
Aleksandar Dragosavac
Senior .NET Developer

Član broj: 84129
Poruke: 228
217.24.18.*



Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:47 - pre 215 meseci
Citat:
Fedya: Ti se onda udubi 110%, jel ima jos nekoliko resenja kako mozes ovo reseti (preko dataseta, storovane...) ali je ovo moje najkrace i najlakse (kad ga shvatis) ;)


Ajde ga lepo objasni onda! :)
Winners never quit, quitters never win.
 
Odgovor na temu

Fedya
Fedor Hajdu
Solution Architect
Emaratech
Dubai, UAE

Član broj: 28246
Poruke: 790
*.ADSL.neobee.net.

Jabber: fedya@elitesecurity.org
Sajt: devtechgroup.com


+34 Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:56 - pre 215 meseci
Citat:
VerbatimBOT: Teoretski gledano, upit vraća rezultat gde je Vrsta jednaka praznom stringu ili parametru @Vrsta. Isto važi i za ostale parametre.
A drugo, nisam siguran koliko bi to radilo ako mu ne proslediš parametar, jer u tom slučaju parametar dobija vrednost NULL...
Ja ne vidim nikakvu IF proveru ovde...? Niti da si objasnio kako bi to implementirao?


Prakticno gledano, upit vraca samo one vrednosti kada je parametar jednak vrsti ili ignorise parametar ako je on prazan ;)

Da sam napisao WHERE ([Velicina] = "" OR...) onda bi vratio to sto ti kazes, a ovako @VELICINA = "" ce proveriti da li je prosledjen parametar

znaci imas ovako
(@par1 = "" or kolona1 = @par1) AND (@par2 = "" OR kolona2 = @par2)

prosledjujemo
@par1 = "" a za @par2="test')

upit ce izgledati ovako:
("" = "" OR kolona1= @par1) AND ("test" = "" OR kolona2 = "test")

nakon toga:posto je "" == "" a "test" != ""

a posto se prvi uslov u OR-u zadovolji drugi se ne proverava:

(true) AND (false OR kolona2 = "test")

Znaci

where kolona2 = "test" i to je sve (party)

Isto si mogao da poredis sa NULL ali posto ovo covek radi iz aplikacije tamo string ne moze da mu bude null.
Every hamster has his day.
 
Odgovor na temu

VerbatimBOT
Aleksandar Dragosavac
Senior .NET Developer

Član broj: 84129
Poruke: 228
217.24.18.*



Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 10:07 - pre 215 meseci
OK, nisam skapirao sta si hteo da kazes, mislim sad jesam!
VoZdra! :)
Winners never quit, quitters never win.
 
Odgovor na temu

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
82.131.209.*

Sajt: www.linkedin.com/in/aleks..


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 10:21 - pre 215 meseci
Pozdrav.
1. Koliko je ovo sporije ( sa ovim poredjenjima) i odnosu na onaj sql da ih nema?
2. Sta bi se desilo kada bih imao ovo (@par1 = "" or kolona1 = @par1) , ali da nisam nigde u kodu definisao parametar @par1 (u nekom if -u utvrdim da nece imati vrednost pa mi ni ne treba, mi pa ga nisam ni pravio) sta se onda desava?


RTFM
 
Odgovor na temu

Fedya
Fedor Hajdu
Solution Architect
Emaratech
Dubai, UAE

Član broj: 28246
Poruke: 790
*.ADSL.neobee.net.

Jabber: fedya@elitesecurity.org
Sajt: devtechgroup.com


+34 Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 10:35 - pre 215 meseci
1. Ne bi trebalo da bude sporije u opste posto upit ne mora da izvrsi nista na bazi, samo sa promenljivama dok ne dobije priblizno isti upit kako i onaj sto bi sklapao pa je efekat isti. Ovako je samo krace i (po meni) preglednije.

2. Ovo sam pisao kada bi se to radilo u aplikaciji, a tamo ne mozes imati NULL za string.
Ako to isto radis na storovanoj (sto je daleko cesce), onda poredis sa NULL, znaci:
(@par1 = NULL or kolona1 = @par1)

Every hamster has his day.
 
Odgovor na temu

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
82.131.209.*

Sajt: www.linkedin.com/in/aleks..


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 11:08 - pre 215 meseci
Znam da ne moze biti null iz aplikacije, ali me zanima sta bi se desilo ako sql sadrzi ime parametra kao ovo
(@par1 = "" or kolona1 = @par1)
a taj parametar u kodu nije definisan a tebi SQL server to ispituje na jednakost sa ""? Verovatno ce baciti gresku..?
RTFM
 
Odgovor na temu

Fedya
Fedor Hajdu
Solution Architect
Emaratech
Dubai, UAE

Član broj: 28246
Poruke: 790
*.ADSL.neobee.net.

Jabber: fedya@elitesecurity.org
Sajt: devtechgroup.com


+34 Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 11:41 - pre 215 meseci
Nisam bas siguran da te razumem. Ako pricamo o primeru gore, SQL serveru nece biti prosledjen parametar sa imenom nego samo njihove vrednosti, tako da ako imas:

SqlCommand cmd = new SqlCommand("SELECT * FROM Nesto WHERE (@param = "" or kolona = @param);
cmd.Parameters.Add("@param", textbox.Text);
cmd.ExecuteNonQuery();

i text ti je prazan, upit koji ce ti generisati SqlCommand i proslediti ga serveru ce izgledati ovako "SELECT * FROM Nesto WHERE ("" = "" or kolona = "")
tako da SQL nece ni bit svestan da si koristio taj parametar.


Ipak, mozda te nisam dobro razumeo...
Every hamster has his day.
 
Odgovor na temu

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
82.131.209.*

Sajt: www.linkedin.com/in/aleks..


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 12:21 - pre 215 meseci
Da preformulisem... stvarno kad sam malo bolje procitao pitanje, nije bas najjasnije...
ako mi je command ovakav
SqlCommand cmd = new SqlCommand("SELECT * FROM Nesto WHERE (@param = "" or kolona = @param);

a ja ne uradim

cmd.Parameters.Add("@param", textbox.Text);

znaci pokusam da izvrsim gornji select bez dodavanja parametara sta se desava?
To sam hteo da pitam, na brzinu, posto nemam trenutno moj komp ovde da probam...

RTFM
 
Odgovor na temu

Fedya
Fedor Hajdu
Solution Architect
Emaratech
Dubai, UAE

Član broj: 28246
Poruke: 790
*.ADSL.neobee.net.

Jabber: fedya@elitesecurity.org
Sajt: devtechgroup.com


+34 Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 12:33 - pre 215 meseci
E, ne moze tako
Dobices gresku, naravno.

Btw, zasto bi radio tako nesto?
Every hamster has his day.
 
Odgovor na temu

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
82.131.209.*

Sajt: www.linkedin.com/in/aleks..


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 13:12 - pre 215 meseci
Nesto sam razmisljao o dinamickom pravljenju parametara, selecta (btw. nisam nikada to radio... :) ), ali kad bolje razmislim glupo je u pravu si... ovako kako sam ja prvo zamislio...
Hvala na odgovorima pozdrav!

RTFM
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 14:17 - pre 215 meseci
Citat:
VerbatimBOT:
Citat:
logic_rabbit: Mozda je bolje da dinamicki pravis sql upit kao npr.
if !(Textbox1.text=="")
{
SqlUpit+="AND Vrsta="+@Vrsta
}
Znaci da dinamicki dodajes novi "AND" ako je textbox za unos pun.


Ovo će sigurno raditi.


Radice, ali uopste nije preporucljivo posto je podlozno SQL injection napadima. Dovoljno je da ukucam '; delete from Proizvodi; u bilo koji text box i da ti obrisem tabelu sa proizvodima. SQLParameters ima mehanizam zastite od ovog napada.


Citat:
Fedya: Ovo sam pisao kada bi se to radilo u aplikaciji, a tamo ne mozes imati NULL za string.
Ako to isto radis na storovanoj (sto je daleko cesce), onda poredis sa NULL, znaci:
(@par1 = NULL or kolona1 = @par1)


Kao prvo, = operator ne radi sa NULLovima, x = NULL uvek vraca false; Ispravni operator je IS, tj
@par1 is NULL

Drugo, ovo je jedini ispravni nacin za resenje ovog problema, stored procedura sa (@par1 is NULL or kolona1 = @par1) AND ... filterom, posto ce resenje sa (="") raditi samo ako su svi paramteri pretrage stringovi. Na aplikaciji je da osigura da se za prazne parametre upuca DBNull.Value u parametar. najjednostavniji nacin u C#-u je preko ?: tj.
Code:

textBox1.Text=="" ? DBNull.Value : <odredisniTip>.Parse(textBox1.Text)


Iako izgleda malo rogobatno ovo resenje je ujedno i najbrze posto ce SQL Query optimizer izbaciti skeniranje indeksa/tabele za one parametre koji su NULL preko boolean optimizacije OR operatora (kao sto je Fedya inicijalno napomenuo). Takodje se NULL moze postaviti kao default vrednost za sve parametre stored procedure, pa onda ne moras cak ni da ih prosledjujes ako su text boxovi prazni.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Problem prilikom detaljne pretrage Baze MSSQL - C#2005

Strane: 1 2

[ Pregleda: 6875 | Odgovora: 30 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.