Šta je novo?

Kako se pravi dinamiki sql upit?

milos_r

Slavan
Učlanjen(a)
31.10.2004
Poruke
487
Poena
319
Pozdrav, zanima me kako da implemetiram malo kompleksniju pretragu za nekoliko tabela koje imam.
Da ne bih sada ovde kacio one prave nakacicu primer koji se podudara. U pitanju su tri povezane tabele a ja zelim da imam pretragu iz moje aplikacije koja je kumulativna. U smislu u zavisnosti sta korisnik izabere od opcija da se prema tome formia sql upit dinamicki koji cu ja da prosledim bazi i popunim dataset.

Evo prvo koda za neku malu bazicu sa tri tabele:
Kod:
/*==============================================================*/
/* Table: GLAVNATABELA                                          */
/*==============================================================*/
create table GLAVNATABELA
(
   ID                   int not null,
   ATTRIBUTE_1          int,
   ATTRIBUTE_2          varchar(20),
   ATTRIBUTE_3          date,
   primary key (ID)
);

/*==============================================================*/
/* Table: TABELA2                                               */
/*==============================================================*/
create table TABELA2
(
   TABELA2ID            int not null,
   ID                   int,
   ATTRIBUTE_21         int,
   primary key (TABELA2ID)
);

/*==============================================================*/
/* Table: TABELA3                                               */
/*==============================================================*/
create table TABELA3
(
   TABELA3ID            int not null,
   ID                   int,
   ATTRIBUTE_31         int,
   primary key (TABELA3ID)
);

alter table TABELA2 add constraint FK_RELATIONSHIP_1 foreign key (ID)
      references GLAVNATABELA (ID) on delete restrict on update restrict;

alter table TABELA3 add constraint FK_RELATIONSHIP_2 foreign key (ID)
      references GLAVNATABELA (ID) on delete restrict on update restrict;

Sad ja bih mogao da napravim to u programskom kodu preko milion if-ova i slaganjem stringova tipa napravim osnovni string koji prikazuje sve podatke:
Kod:
string sql = "SELECT DISTINCT GLAVNATABELA.ID, GLAVNATABELA.ATTRIBUTE_1, GLAVNATABELA.ATTRIBUTE_2, GLAVNATABELA.ATTRIBUTE_3 FROM GLAVNATABELA LEFT OUTER JOIN TABELA2 ON GLAVNATABELA.ID = TABELA2.ID LEFT OUTER JOIN TABELA3 ON GLAVNATABELA.ID = TABELA3.ID";

pa posle slazem ako korisnik tipa izabere da se prikazuju samo podaci gde je ovaj int veci od necega:
Kod:
if(izabran filter1){
sql += " WHERE GLAVNATABELA.ATTRIBUTE_1 >= [nekaVrednost]"
if(izabran filter2){
sql += " and TABELA3.ATTRIBUTE_31 is not null"
}
}
i tako da dodajem u kodu imao bih jedno 500 linija koda u slaganju sql-a. o performansama takvog koda ne bih trosio reci.
Dakle mene interesuje ima li neki laksi nacin da resim ovo da dinamicki slazem ovaj sql upit koji mi je potreban.
Hvala unapred na odgovorima.
Milos
 

Prilozi

  • pitanje.png
    pitanje.png
    17 KB · Pregleda: 83
Poslednja izmena:
Iz tvog pitanja se ne vidi bas ni koji jezik koristis (neki C/C++/C#, pretpostavljam) ni koje su jos tehnologije ukljucene, ali mi se cini da moras ovako. Generalno negde moras da ispitas sta je izabrano, na ovaj ili onaj nacin. Ako pravis forms aplikaciju tj. vizuelnu u tome ti malo mogu pomoci kontrole, ali mi se cini da to nije slucaj :) .

Sto se performansi tice, nisu kriticne. Tebi najveci deo vremena oduzima izvrsenje same SQL naredbe, 500 literalnih poredjenja se vrsi relativno brzo.
 
Ma meni programerski deo apsolutno nije problem. Inace u pitanj je C# programski jezik i asp.net web aplikacija. Sto je najgore evo napravio sam if-ova i radi, ali stvrano izgleda grozno takav kod
 
kao sto rece webwolf, sto se mora mora se. a sigurno mozes to da ulepsas sa nekim loop-om ili bar switch-om + je lakse da svi ti stringovi i filter flag-ovi budu u nekakvim nizovima/listama/recnicima radi lakseg odrzavanja.
 
Ma ok radi to tako ali me smorilo da vam pravo kazem. Citam ceo dan evo i pokusavam da naucim da pravim malo kompleksnije procedure koje ocigledno to mogu da urade za mene mesto ovih silnih if-ova.
evo jednog primera koji otprilike radi ovo sto sam ja pisao u samom programskom jeziku
Kod:
/* This stored procedure builds dynamic SQL and executes 
using sp_executesql */
Create Procedure sp_EmployeeSelect
    /* Input Parameters */
    @EmployeeName NVarchar(100),
    @Department NVarchar(50),
    @Designation NVarchar(50),
    @StartDate DateTime,
    @EndDate DateTime,
    @Salary    Decimal(10,2)
        
AS
    Set NoCount ON
    /* Variable Declaration */
    Declare @SQLQuery AS NVarchar(4000)
    Declare @ParamDefinition AS NVarchar(2000) 
    /* Build the Transact-SQL String with the input parameters */ 
    Set @SQLQuery = 'Select * From tblEmployees where (1=1) ' 
    /* check for the condition and build the WHERE clause accordingly */
    If @EmployeeName Is Not Null 
         Set @SQLQuery = @SQLQuery + ' And (EmployeeName = @EmployeeName)'

    If @Department Is Not Null
         Set @SQLQuery = @SQLQuery + ' And (Department = @Department)' 
  
    If @Designation Is Not Null
         Set @SQLQuery = @SQLQuery + ' And (Designation = @Designation)'
  
    If @Salary Is Not Null
         Set @SQLQuery = @SQLQuery + ' And (Salary >= @Salary)'

    If (@StartDate Is Not Null) AND (@EndDate Is Not Null)
         Set @SQLQuery = @SQLQuery + ' And (JoiningDate 
         BETWEEN @StartDate AND @EndDate)'
    /* Specify Parameter Format for all input parameters included 
     in the stmt */
    Set @ParamDefinition =      ' @EmployeeName NVarchar(100),
                @Department NVarchar(50),
                @Designation NVarchar(50),
                @StartDate DateTime,
                @EndDate DateTime,
                @Salary    Decimal(10,2)'
    /* Execute the Transact-SQL String with all parameter value's 
       Using sp_executesql Command */
    Execute sp_Executesql     @SQLQuery, 
                @ParamDefinition, 
                @EmployeeName, 
                @Department, 
                @Designation, 
                @StartDate, 
                @EndDate,
                @Salary
                
    If @@ERROR <> 0 GoTo ErrorHandler
    Set NoCount OFF
    Return(0)
  
ErrorHandler:
    Return(@@ERROR)
GO

E sad mene buni kako to da implementiram na ove tabele koje su u relaciji?
 
Nisam ovo radio, pa ne mogu da ti pomognem, ali moja zdrava logika kaze da to ne treba raditi u samoj bazi, vec programski kao sto si zapoceo, jer se ovim uvlacis u probleme:

1. Meni deluje ubitacno komplikovano (mozda nije)
2. Ubijas fleksibilnost, u bazu guras ogranicenja koja ti se jednog dana mogu obiti o glavu ukoliko ti treba neko prosirenje. C# program ces lakse izmeniti nego ovako kilometarsku definiciju. My 2 cents.

A bahati ti je lepo rekao, meni je prvo pala na pamet neka hash tabela gde bi kljuc bio filter od strane korisnika a sadrzaj parametar query-a. Mada cak i to zahteva pesacki posao punjenja te tabele, sa druge strane to moze biti elegantno resenje za kasnije prosirenje.

Ako zelis jednostavno da kontrolises kod (valjda radis u Visual Studio) koristi #region i #endregion direktive, mozda ti pomogne, ili to sto imas razbacaj u funkcije.
 
Klasicna boljka C# programera. Sav sql trpaju u bazu :).
Kod dinamickih upita ti ne gine gomila if-ova. Nisam C# programer pa nisam upoznat sa bibliotekama dostupni za tu platformu. U Javi postoji biblioteka pod imenom Squiggle koja sluzi da malo ulepsa stvari. Ako ti aplikacija kojim slucajem koristi hibernate onda mozes da koristis njegov Criteria API. Ako ocekujes da ces imati dosta dinamickog sql-a onda mozes i sam da natabas neku podrsku za to.
 
Ja bi ti preporucio da to uopste ne radis direktno u sql-u. Em komplikujes bzvz, em nisi fleksibilan, em se izlazes mogucnosti napada na sajt preko sql injectovanja. Bolje ti je radi preko linq-a u c#.
Ako ti je baza jednostavna moze linq 2 sql, a ako je komlikovanija, onda bi mogao da koristis i neki orm (entity framework ili nhibernate) mada ti to mozda bude overkill.
 
Прво морам да те питам, како се са UI стране одређује упит, тј, услови за упит? Преко чекбоксова, текстбокса, комбобокса или све наведено?

Лепа ствар код .NET је што можеш да напишеш foreach петљу, која ће да провери сваки појединачну контролу, према типу контроле. http://www.krissteele.net/blogdetails.aspx?id=104

Већ си добио предлог за употребу switch->case петље, што би требало да ти смањи количину кода. Такође, убаци у 'case' део додатне провере.

У сваком случају, С# је далеко бржи од SQL-a. Самим тим, далеко је боље и ефиканије решење да правиш упит у коду, него на самој бази.

А ако је могуће, проследи део или комплетан упит, преко ајах-а.
 
Прво морам да те питам, како се са UI стране одређује упит, тј, услови за упит? Преко чекбоксова, текстбокса, комбобокса или све наведено?

Лепа ствар код .NET је што можеш да напишеш foreach петљу, која ће да провери сваки појединачну контролу, према типу контроле. http://www.krissteele.net/blogdetails.aspx?id=104

Већ си добио предлог за употребу switch->case петље, што би требало да ти смањи количину кода. Такође, убаци у 'case' део додатне провере.

У сваком случају, С# је далеко бржи од SQL-a. Самим тим, далеко је боље и ефиканије решење да правиш упит у коду, него на самој бази.

А ако је могуће, проследи део или комплетан упит, преко ајах-а.
Ovo sa foreach petljom deluje zanimljivo na prvi pogled. Morao bih malo kasnije da sednem i smislim kako bih prolazio kroz razlicite tipove kontrola i pronalazio aktivnu.
Cini mi se da je srz problema pronaci prvu na kojoj ce stajati where klauzula. Mozda da je moguce iskoristiti nekako ovu petlju za to.
Svejedno hvala puno na predlogu bas je orginalan :)
Milos
 
Сад сам пробао нешто и ево ти почетни код, тј пример истог:
Kod:
foreach (Control c in Form.Controls)
{
    if (c is TextBox)
    {
        TextBox txt = (TextBox)c;
        txt.Text = "";
    }
}

Ја сам овде брисао вредности из текстбокс контрола, али верујем да капираш логику. Ја бих у оквир foreach убацио switch за типове контрола које користиш приликом генерисања упита, тј за сам упит и онда радио додатне провере.
Нисам радио дуго asp.net, па сам малко испао из ”штоса” али врати се све то, јако брзо. ;)

Него, једно кратко питање, да ли су ти сви услови AND или OR или, пак, имаш комбинацију оба?


Kod:
var appStr;
$(".checkbox_naziv").each(function() {
			var ckbox = $(this);
			if(ckbox.is(':checked')) {
				if(appStr == "") {
					appStr = " AND (tabela.kolona = "+ckbox.attr('value');
				}
				else {
					if(is_and == 1) {
						appStr += " AND tabela.kolona = "+ckbox.attr('value');
					}
					else {
						appStr += " OR tabela.kolona = "+ckbox.attr('value');	
					}	
				}
			}
		});

if(appStr != "") { appStr += ")"; }

Последња линија кода је да затвориш заграду, очигледно. :d
Ово је преко jQuery-a, имаш буквално низ променљивих са истом класом, урадиш итерацију кроз све, па пронађеш оне који су чекирани.

Не знам шта ти тачно треба али ти набацујем идеје како да направиш најједноставније и најефикасније решење. ;)
 
Poslednja izmena:
Сад сам пробао нешто и ево ти почетни код, тј пример истог:
Kod:
foreach (Control c in Form.Controls)
{
    if (c is TextBox)
    {
        TextBox txt = (TextBox)c;
        txt.Text = "";
    }
}

Ја сам овде брисао вредности из текстбокс контрола, али верујем да капираш логику. Ја бих у оквир foreach убацио switch за типове контрола које користиш приликом генерисања упита, тј за сам упит и онда радио додатне провере.
Нисам радио дуго asp.net, па сам малко испао из ”штоса” али врати се све то, јако брзо. ;)

Него, једно кратко питање, да ли су ти сви услови AND или OR или, пак, имаш комбинацију оба?


Kod:
var appStr;
$(".checkbox_naziv").each(function() {
			var ckbox = $(this);
			if(ckbox.is(':checked')) {
				if(appStr == "") {
					appStr = " AND (tabela.kolona = "+ckbox.attr('value');
				}
				else {
					if(is_and == 1) {
						appStr += " AND tabela.kolona = "+ckbox.attr('value');
					}
					else {
						appStr += " OR tabela.kolona = "+ckbox.attr('value');	
					}	
				}
			}
		});

if(appStr != "") { appStr += ")"; }

Последња линија кода је да затвориш заграду, очигледно. :d
Ово је преко jQuery-a, имаш буквално низ променљивих са истом класом, урадиш итерацију кроз све, па пронађеш оне који су чекирани.

Не знам шта ти тачно треба али ти набацујем идеје како да направиш најједноставније и најефикасније решење. ;)

Evo konkretnog polja koje formira pretragu
2a9o4xv.jpg

prva dva reda su iz glavne tabele, ostali redovi su svaki za zasebnu tabelu u bazi vezani jedan na prema vise ka glavnoj tabeli isto kao u prvom postu u primeru. Dakle ko sto rekoh pretraga treba biti potpuno kumulativna, kada se izabere dugme pretrage on prodje korz sve kontrole i na prvu koju naidje da je popunjena doda sql stringu WHERE i onda na sve ostale smao dodaje AND i na kraju ako apenduje OREDR BY iz ove poslednje padajuce liste.
 
Kod:
string query = "SELECT * FROM tabela WHERE ";

foreach (Control c in Form.Controls)
{
    if (c is ComboBox)
    {
	//kako bi sprecio pojavu drugih combobox vrednosti, 
        //samo iz ovog za lokaciju
        if(c.name == 'lokacija') 
		{
			query += "tabela.lokacija = "+ c.selectedValue();
		}
    }
	else if(c is TextBox)
	{
		if(c.txt != "")
	}
	else if(c is CheckBox)
	{
	       if(c.checked == true)
	}
		 
}
query += " ORDER BY "+ tipSortiranja.selectedValue();


Ja sam ovo uradio na brzaka, posto na zalost, moram da se spremim, jer palim na svadbu za nepunih pola sata... a ide mi se u tri lepe mnogo. :wall:

Vidi ovako, posto sada kapiram sta ti treba, pretpostavljam da su ti sve te kontrole u okviru neke druge kontrole, tipa groupBox? Jer onda uradis iteraciju putem foreach petlje Control c in GroupBox1.Controls
ili nesto na tu foru, da bi smanjio broj kontroli za proveru, a opet i ako nisu, nemas ti 5000 kontrola na svojoj formi, da bi to potrajalo vecnost, jer ce biti veoma brzo.

Sto se tice TextBox i CheckBox kontrola, trazis onu koja ima tekst u sebi, odnosno one checkbox-ove koji su checkirani.

Nadam se da sam ti barem malo pomogao, posto sam ovo radio bez pristupa Visual Studio-u, greske su apsolutno moguce.
 
Pazi se samo ovih polja za unos datuma. Mozda ti je bolje da stavis date picker kontrolu, ako ce se program koristiti na razlicitim racunarima ili postoji mogucnost da se promeni format pamcenja datuma na samom racunaru. Malo je falilo da mi obori ceo projekat bas ovako kako si ti uradio. Kontrola sama parsira datum i prevodi iz formata u format i lakse ces izvrsavati neko poredjenje u programu. Takodje se nadam da koristis DateTime i TimeSpan tipove, da ne poredis vreme nekako rucno.

@ays
Mislim da ce raditi i foreach(TextBox t in Form.Controls)... mislim :).
 
Poslednja izmena:
Cesto radim slicne upite, i obicno na pocetku stringa mozes staviti WHERE 1=1 (vraca sve) ili stavis WHERE 0 = 1 (vraca "nista"), pa onda mozes jednostavno slagati ostatak upita sa "AND" ili "OR".

I naravno, obavezno neki vid validacije vrijednosti polja, kako ne bi dobio "sql injekciju"....
 
Iz nekog razloga odustao sam na kraju od petlji malo sam sredio ova grananja i odlucio sam da vise ne diram tu nista. Sto se tice validacije naravno da su sva polja zasticena od strane asp validaotra. Ona polja za datume su ajax kalendari nakaceni na tekstboksove sa unapred predefinisanim formatom da ne bi dolazilo do gresaka.
Evo i metode ako bas nekog interesuje
Kod:
        public void NapraviSqlUpit()
        {
            //1 
            if (ddlLokacija.SelectedValue != "0")
                _formatiranSqlUpitSaFilterima += string.Format(" DnevniIzvestaj.Lokacija = '{0}'",ddlLokacija.SelectedItem);

            //2
            if (tbDatumOd.Text != "" && ddlLokacija.SelectedValue == "0")
                _formatiranSqlUpitSaFilterima += string.Format(" DnevniIzvestaj.DatumUnosa >= '{0}'", tbDatumOd.Text);
            else if (tbDatumOd.Text != "" && ddlLokacija.SelectedValue != "0")
                _formatiranSqlUpitSaFilterima += string.Format(" AND DnevniIzvestaj.DatumUnosa >= '{0}'", tbDatumOd.Text);

            //3
            if (tbDatumDo.Text != "" && tbDatumOd.Text == "" && ddlLokacija.SelectedValue == "0")
                _formatiranSqlUpitSaFilterima += string.Format(" DnevniIzvestaj.DatumUnosa <= '{0}'", tbDatumDo.Text);
            else if (tbDatumDo.Text != "" && (tbDatumOd.Text != "" || ddlLokacija.SelectedValue != "0"))
                _formatiranSqlUpitSaFilterima += string.Format(" AND DnevniIzvestaj.DatumUnosa <= '{0}'", tbDatumDo.Text);

            //4
            if (cbImaloPrekida.Checked && tbDatumDo.Text == "" && tbDatumOd.Text == "" &&
                ddlLokacija.SelectedValue == "0")
                _formatiranSqlUpitSaFilterima += string.Format(" Prekidi.VremeTrajanjaPrekidaMinuti IS NOT NULL");
            else if (cbImaloPrekida.Checked && (tbDatumDo.Text != "" || tbDatumOd.Text != "" ||
                ddlLokacija.SelectedValue != "0"))
                _formatiranSqlUpitSaFilterima += string.Format(" AND Prekidi.VremeTrajanjaPrekidaMinuti IS NOT NULL");

            //5
            if (tbUredjajSaPrekidom.Text != "" && !cbImaloPrekida.Checked && tbDatumDo.Text == "" &&
                tbDatumOd.Text == "" &&
                ddlLokacija.SelectedValue == "0")
                _formatiranSqlUpitSaFilterima += string.Format(" Prekidi.UredjajSaPrekidom LIKE '{0}'",
                                                               tbUredjajSaPrekidom.Text);
            else if (tbUredjajSaPrekidom.Text != "" && (cbImaloPrekida.Checked || tbDatumDo.Text != "" ||
                tbDatumOd.Text != "" ||
                ddlLokacija.SelectedValue != "0"))
                _formatiranSqlUpitSaFilterima += string.Format(" AND Prekidi.UredjajSaPrekidom LIKE '{0}'",
                                                               tbUredjajSaPrekidom.Text);
            //6
            if (tbEmiterSaPrekidom.Text != "" && tbUredjajSaPrekidom.Text == "" && !cbImaloPrekida.Checked &&
                tbDatumDo.Text == "" &&
                tbDatumOd.Text == "" &&
                ddlLokacija.SelectedValue == "0")
                _formatiranSqlUpitSaFilterima += string.Format(" Prekidi.EmiterSaPrekidom LIKE '{0}'",
                                                               tbEmiterSaPrekidom.Text);
            else if (tbEmiterSaPrekidom.Text != "" && (tbUredjajSaPrekidom.Text != "" || cbImaloPrekida.Checked ||
                tbDatumDo.Text != "" ||
                tbDatumOd.Text != "" ||
                ddlLokacija.SelectedValue != "0"))
                _formatiranSqlUpitSaFilterima += string.Format(" AND Prekidi.EmiterSaPrekidom LIKE '{0}'",
                                                               tbEmiterSaPrekidom.Text);

            //7
            if (tbVremeTrajanjaPrekidaUMinutima.Text != "" && tbEmiterSaPrekidom.Text == "" &&
                tbUredjajSaPrekidom.Text == "" && !cbImaloPrekida.Checked &&
                tbDatumDo.Text == "" &&
                tbDatumOd.Text == "" &&
                ddlLokacija.SelectedValue == "0")
                _formatiranSqlUpitSaFilterima += string.Format(" Prekidi.VremeTrajanjaPrekidaMinuti >= '{0}'",
                                                               tbVremeTrajanjaPrekidaUMinutima.Text);
            else if (tbVremeTrajanjaPrekidaUMinutima.Text != "" && (tbEmiterSaPrekidom.Text != "" ||
                tbUredjajSaPrekidom.Text != "" || cbImaloPrekida.Checked ||
                tbDatumDo.Text != "" ||
                tbDatumOd.Text != "" ||
                ddlLokacija.SelectedValue != "0"))
                _formatiranSqlUpitSaFilterima += string.Format(" AND Prekidi.VremeTrajanjaPrekidaMinuti >= '{0}'",
                                                               tbVremeTrajanjaPrekidaUMinutima.Text);
            //8
            if (cbRadioAgregat.Checked && tbVremeTrajanjaPrekidaUMinutima.Text == "" && tbEmiterSaPrekidom.Text == "" &&
                tbUredjajSaPrekidom.Text == "" && !cbImaloPrekida.Checked &&
                tbDatumDo.Text == "" &&
                tbDatumOd.Text == "" &&
                ddlLokacija.SelectedValue == "0")
                _formatiranSqlUpitSaFilterima += string.Format(" Energetika.VremeRadaAgregataMinuti IS NOT NULL");
            else if (cbRadioAgregat.Checked && (tbVremeTrajanjaPrekidaUMinutima.Text != "" || tbEmiterSaPrekidom.Text != "" ||
                tbUredjajSaPrekidom.Text != "" || cbImaloPrekida.Checked ||
                tbDatumDo.Text != "" ||
                tbDatumOd.Text != "" ||
                ddlLokacija.SelectedValue != "0"))
                _formatiranSqlUpitSaFilterima += string.Format("AND Energetika.VremeRadaAgregataMinuti IS NOT NULL");

            //9
            if (cbBiloPrisutnihEkipa.Checked && !cbRadioAgregat.Checked && tbVremeTrajanjaPrekidaUMinutima.Text == "" &&
                tbEmiterSaPrekidom.Text == "" &&
                tbUredjajSaPrekidom.Text == "" && !cbImaloPrekida.Checked &&
                tbDatumDo.Text == "" &&
                tbDatumOd.Text == "" &&
                ddlLokacija.SelectedValue == "0")
                _formatiranSqlUpitSaFilterima += string.Format(" Ekipe.PrisutnaEkipa IS NOT NULL");
            else if (cbBiloPrisutnihEkipa.Checked && (cbRadioAgregat.Checked || tbVremeTrajanjaPrekidaUMinutima.Text != "" ||
                tbEmiterSaPrekidom.Text != "" ||
                tbUredjajSaPrekidom.Text != "" || cbImaloPrekida.Checked ||
                tbDatumDo.Text != "" ||
                tbDatumOd.Text != "" ||
                ddlLokacija.SelectedValue != "0"))
                _formatiranSqlUpitSaFilterima += string.Format(" AND Ekipe.PrisutnaEkipa IS NOT NULL");

            //10
            if (tbPrisutnaEkipa.Text != "" && !cbBiloPrisutnihEkipa.Checked && !cbRadioAgregat.Checked &&
                tbVremeTrajanjaPrekidaUMinutima.Text == "" &&
                tbEmiterSaPrekidom.Text == "" &&
                tbUredjajSaPrekidom.Text == "" && !cbImaloPrekida.Checked &&
                tbDatumDo.Text == "" &&
                tbDatumOd.Text == "" &&
                ddlLokacija.SelectedValue == "0")
                _formatiranSqlUpitSaFilterima += string.Format(" Ekipe.PrisutnaEkipa LIKE '{0}'", tbPrisutnaEkipa.Text);
            else if (tbPrisutnaEkipa.Text != "" && (cbBiloPrisutnihEkipa.Checked || cbRadioAgregat.Checked ||
                tbVremeTrajanjaPrekidaUMinutima.Text != "" ||
                tbEmiterSaPrekidom.Text != "" ||
                tbUredjajSaPrekidom.Text != "" || cbImaloPrekida.Checked ||
                tbDatumDo.Text != "" ||
                tbDatumOd.Text != "" ||
                ddlLokacija.SelectedValue != "0"))
                _formatiranSqlUpitSaFilterima += string.Format(" AND Ekipe.PrisutnaEkipa LIKE '{0}'", tbPrisutnaEkipa.Text);

            //11
            switch (ddSortiranjeTip.SelectedValue)
            {
                case "1":
                    _formatiranSqlUpitSaFilterima += string.Format(" ORDER BY DnevniIzvestaj.DatumUnosa");
                    break;
                case "2":
                    _formatiranSqlUpitSaFilterima += string.Format(" ORDER BY DnevniIzvestaj.Lokacija");
                    break;
            }
        }

Hvala svima na sugestijama.
 
Grozomorno je... znam da radi, ali je horor. Ja sam koristio ovakve varijante - napraviš upit koji obuhvata sve što ti treba, jedino što starije verzije SQL server ne mogu da optimizuju takav kod...
Recimo
SELECT smthg FROM Table
WHERE ID = @ID OR @ID IS NULL
AND smthelse = @else OR @else IS NULL
...
Ukida potrebu za if-varijantama. Druga stvar, zašto ne napraviš klasu koja će biti bindovana za GUI i ne kupiš vrednosti iz nje?
 
sad ne mogu da objasnjavam ali morao sam ispratiti koncept ostatka aplikacije zato je ovako i nema linq-a ka tabelama. bitno je da radi i ne diram dok ne prodje to cemu je namenjena
 
Сад сам пробао нешто и ево ти почетни код, тј пример истог:
Kod:
foreach (Control c in Form.Controls)
{
    if (c is TextBox)
    {
        TextBox txt = (TextBox)c;
        txt.Text = "";
    }
}
Takođe možeš i

Kod:
if (c is TextBox) (c as TextBox).Text = "";
 
Ima li uopšte potrebe za unboxingom? Control ima property Text, pa bi verovatno radilo i
Kod:
c.Text = "";
netestirano...
 
Takođe možeš i

Kod:
if (c is TextBox) (c as TextBox).Text = "";

Ovakve konstrukte treba izbegavati jer nisu optimalni. Nikada ne koristis is i as zajedno na ovaj nacin. Ili koristis is iza koga sledi obicno kastovanje (obicno za value tipove), ili koristis samo as iza koga sledi null check (za reference tipove).
 
Poslednja izmena:
Nazad
Vrh Dno