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: 1901 | Odgovora: 30 ]

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
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.
09.08.2006. u 17:26 

Solution
Vladimir Stankovic
Solution software
Leskovac

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

Sajt: www.zaljubise.com


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200509.08.2006. u 18:03
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.com - najbolji sajt za upoznavanje
09.08.2006. u 18:03 

Fedya
Fedor Hajdu
Senior Software Engeneer, Ammado Internet Services
Novi Sad

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

Jabber: fedya@elitesecurity.org
Sajt: www.ammado.com


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 08:10
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.
while ( ! ( succeed = try() ) );
--
Does the little mermaid wear an algaebra?
10.08.2006. u 08:10 

logic_rabbit
Radenko Zec
banjaluka

Član broj: 74458
Poruke: 183
87.250.108.*

Sajt: www.developers.ba


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:14
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)
www.sqlpass.rs.ba
10.08.2006. u 09:14 

Fedya
Fedor Hajdu
Senior Software Engeneer, Ammado Internet Services
Novi Sad

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

Jabber: fedya@elitesecurity.org
Sajt: www.ammado.com


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:23
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.
while ( ! ( succeed = try() ) );
--
Does the little mermaid wear an algaebra?
10.08.2006. u 09:23 

VerbatimBOT
Aleksandar Dragosavac
Senior .NET Developer
Serbia, Belgrade

Član broj: 84129
Poruke: 224
217.24.18.*

Sajt: https://www.xing.com/prof..


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:29
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.
10.08.2006. u 09:29 

Fedya
Fedor Hajdu
Senior Software Engeneer, Ammado Internet Services
Novi Sad

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

Jabber: fedya@elitesecurity.org
Sajt: www.ammado.com


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:32
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!
while ( ! ( succeed = try() ) );
--
Does the little mermaid wear an algaebra?
10.08.2006. u 09:32 

Fedya
Fedor Hajdu
Senior Software Engeneer, Ammado Internet Services
Novi Sad

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

Jabber: fedya@elitesecurity.org
Sajt: www.ammado.com


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:39
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)
while ( ! ( succeed = try() ) );
--
Does the little mermaid wear an algaebra?
10.08.2006. u 09:39 

VerbatimBOT
Aleksandar Dragosavac
Senior .NET Developer
Serbia, Belgrade

Član broj: 84129
Poruke: 224
217.24.18.*

Sajt: https://www.xing.com/prof..


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:44
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.
10.08.2006. u 09:44 

VerbatimBOT
Aleksandar Dragosavac
Senior .NET Developer
Serbia, Belgrade

Član broj: 84129
Poruke: 224
217.24.18.*

Sajt: https://www.xing.com/prof..


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:47
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.
10.08.2006. u 09:47 

Fedya
Fedor Hajdu
Senior Software Engeneer, Ammado Internet Services
Novi Sad

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

Jabber: fedya@elitesecurity.org
Sajt: www.ammado.com


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 09:56
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.
while ( ! ( succeed = try() ) );
--
Does the little mermaid wear an algaebra?
10.08.2006. u 09:56 

VerbatimBOT
Aleksandar Dragosavac
Senior .NET Developer
Serbia, Belgrade

Član broj: 84129
Poruke: 224
217.24.18.*

Sajt: https://www.xing.com/prof..


Profil

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

aleksandarpopov
Software developer
Senta

Član broj: 57172
Poruke: 481
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
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
10.08.2006. u 10:21 

Fedya
Fedor Hajdu
Senior Software Engeneer, Ammado Internet Services
Novi Sad

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

Jabber: fedya@elitesecurity.org
Sajt: www.ammado.com


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 10:35
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)

while ( ! ( succeed = try() ) );
--
Does the little mermaid wear an algaebra?
10.08.2006. u 10:35 

aleksandarpopov
Software developer
Senta

Član broj: 57172
Poruke: 481
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
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
10.08.2006. u 11:08 

Fedya
Fedor Hajdu
Senior Software Engeneer, Ammado Internet Services
Novi Sad

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

Jabber: fedya@elitesecurity.org
Sajt: www.ammado.com


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 11:41
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...
while ( ! ( succeed = try() ) );
--
Does the little mermaid wear an algaebra?
10.08.2006. u 11:41 

aleksandarpopov
Software developer
Senta

Član broj: 57172
Poruke: 481
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
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
10.08.2006. u 12:21 

Fedya
Fedor Hajdu
Senior Software Engeneer, Ammado Internet Services
Novi Sad

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

Jabber: fedya@elitesecurity.org
Sajt: www.ammado.com


Profil

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

Btw, zasto bi radio tako nesto?
while ( ! ( succeed = try() ) );
--
Does the little mermaid wear an algaebra?
10.08.2006. u 12:33 

aleksandarpopov
Software developer
Senta

Član broj: 57172
Poruke: 481
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
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
10.08.2006. u 13:12 

mmix
Miljan Mitrovic
Software Architect
Pancevo, Srbija

SuperModerator
Član broj: 17944
Poruke: 1966
69.17.213.*

Sajt: blog.mitrovic.rs


Profil

icon Re: Problem prilikom detaljne pretrage Baze MSSQL - C#200510.08.2006. u 14:17
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.
▪ "Why isn't my wireless mouse connected to the computer?" - 2008 Dumbest Technical Support Question
▪ The word 'politics' is derived from the word 'poly', meaning 'many', and the word 'ticks', meaning 'blood sucking parasites' - Hardiman
▪ If the good guy gets the girl, it's rated PG; if the bad guy gets the girl, it's rated R; and if everybody gets the girl, it's rated X



10.08.2006. u 14:17 

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

Strane: 1 2

[ Pregleda: 1901 | Odgovora: 30 ]

Postavi temu Odgovori

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