více SqlDataSource do jednoho GridView   zodpovězená otázka

ASP.NET WebForms, Databáze

Jsem v ASP.NET začátečník, a mám následující problém. Vytvářím stránku určenou k vyhledávání v SQL databázi - telefonní seznam, chci ale vyhledávat podle více kritérií. Např podle čísla nebo podle jména. Takže mám zatím vytvořené 2 SqlDataSource, každý pro jiný typ vyhledávání. Chtěl bych ovšem podle právě použitého SqlDataSource tento výsledek vyhledávání zobrazit v jednom GridView. Zatím používám 2 GridView, pro každý SqlDataSource jeden.

Jak tohle nějak inteligentně vyřešit ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Určitě by to šlo, ale myslím si že bude jednodušší použít pouze jeden dataSource a měnit pouze dotaz na databázi, popř jeho parametry.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrá, ale jak to pořešit, toto řešení mi ASP.NET vzít nechce ...

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DataConnectionString %>"
            SelectCommand="SELECT ... FROM ... WHERE ([Cislo] = @Cislo)"
            SelectCommand="SELECT ... FROM ... WHERE ([Nazev] LIKE '%' + @Nazev + '%')">
            <SelectParameters>
                <asp:ControlParameter ControlID="TextBox1" Name="Cislo" PropertyName="Text" Type="Double" />
                <asp:ControlParameter ControlID="TextBox2" Name="Nazev" PropertyName="Text" Type="String" />
                
            </SelectParameters>

Hlásí mi to, že nemůžu do jednoho SqlDataSource dát více než jeden SelectCommand.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To samozřejmě nemůžete, datasource by pak neměl z čeho vyvěštit jaký selectCommand chcete použít. Ten select tam vložíte jen jeden a pak ho budete muset měnit dynamicky z Visual Basicu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak nějak jsem doufal, že to pozná podle toho parametru :)

Nějaký příkladek toho kódu, jak by to mohlo fungovat by nebyl ?

Jsem přece jenom začátečník ...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Stačí použít jeden sqlDatasource a v SelectCommand zadat vhodnou podmínku, např

([Cislo] LIKE '%' + @Cislo + '%') And ([Nazev] LIKE '%' + @Nazev + '%')

pro jednotlivé parametry nastavit

ConvertEmptyStringToNull="false"

zk

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No, takhle to skončí chybou: Input string was not in a correct format.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud jde o kombinaci, kde je také číslo, tak mi funguje např. toto (zjednodušeno):

SelectCommand="SELECT * FROM [ADRESY] WHERE ( ( @idadresy=0 or [idadresy] = @idadresy ) AND ([FIRMA] LIKE '%' + @FIRMA + '%')" >
        <SelectParameters>
                Type="String" ConvertEmptyStringToNull="false" />
            <asp:ControlParameter ControlID="txtFirma" Name="FIRMA" PropertyName="Text" Type="String"
                ConvertEmptyStringToNull="false" />
            <asp:ControlParameter ControlID="txtIDadresy" Name="idadresy" PropertyName="Text"
                Type="Int32" DefaultValue="0" />
        </SelectParameters>

ZK

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No u mě to vyhodí komplet tabulku bez jakéhokoliv výběru.

Fakt by se u někoho nenašel nějaký skriptík (nejlépe C#), který tohle řeší ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přepínání mezi více SqlDataSource:

1) U asp:GridView nechte prázdný atribut DataSourceID

2) V C# kódu v momentě hledání dejte následující kód (například do obsluhy stisku tlačítka pro hledání):

GridView1.DataSourceID = "SqlDataSource1";

Místo "SqlDataSource1" samozřejmě dejte ID SqlDataSource, který se má použít.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jak moc se ty SQL dotazy liší, že chcete mít více datasourců? Nedá se to vyřešit pomocí parametrů?

Třeba pro filtrování dle některých sloupečků můžete do WHERE dát něco jako:

WHERE 
  ((@CategoryID IS NULL) OR ([CategoryId] = @CategoryId))
  AND
  ((@Name IS NULL) OR ([Name] = @Name))
nahlásit spamnahlásit spam 0 odpovědětodpovědět

2Tomáš Herceg:

Tohle jsem taky zkoušel, jen jsem to měl takhle:

WHERE ( ( @Cislo IS NULL) OR ([Cislo] = @Cislo )) AND ((@Nazev IS NULL) OR ([Nazev] LIKE '%' + @Nazev + '%'))

Výsledkem bylo, že mi fungovalo pouze první vyhledání pomocí čísla a potom už nic.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Co znamená, že mi fungovalo pouze první vyhledání pomocí čísla?

Nezobrazilo to nic? Vyhodilo to chybu? Vrátilo to nevyfiltrované výsledky? Já fakt tu křištálovou kouli nemám.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Správně to vyhledalo jen první hledané číslo (ne text). Poté už vůbec nic.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pošlete sem, jak vypadají ty parametry datasource a zajykých zdrojů je plníte. Tenhle dotaz je v pořádku a měl by fungovat.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

A ještě mě napadá - zkuste do SqlDataSource tagu přidat CancelSelectOnNullParameter="false".

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Omlouvám se za pozdní odpověď, jednak už to mám vyřešeno jinak a jednak potřeboval jsem přednostně řešit další věci. Takhle se to chová dost zvláštně, i s tím dodaným parametrem to teď vyhazuje všechna čísla.

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NejakyConnectionString %>"
         SelectCommand="SELECT * FROM [TelSeznam$] WHERE ( ( @Cislo IS NULL) OR ([Cislo] = @Cislo )) AND ((@Nazev IS NULL) OR ([Nazev] LIKE '%' + @Nazev + '%'))"
         CancelSelectOnNullParameter="False">
         <SelectParameters>
             <asp:ControlParameter ControlID="TextBox1" Name="Cislo" PropertyName="Text" Type="Int32"  />
             <asp:ControlParameter ControlID="TextBox2" Name="Nazev" PropertyName="Text" Type="String" />   
         </SelectParameters>
        </asp:SqlDataSource>

nahlásit spamnahlásit spam 0 odpovědětodpovědět

2Petr Mašek:

Jednoduché a přitom velmi inteligentní řešení mého problému, asi bych to zkusil i sám, jen jsem netušil, že lze ponechat u asp:GridView prázdný atribut DataSourceID.

V každém případě děkuji, i ostatním, donutilo mě to aspoň více přemýšlet:)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback