query v tableadapteri, nie vsetky vyberove podmienky   zodpovězená otázka

ADO.NET

Zdravim.

Mam formular s jednym datagridview do ktoreho nacitavam vysledok query, kt. je "zadrotovany" v tableadapteri v xsd.

Takto vyzera query v tableadapteri - Firmy_hlavnaTableAdapter:

SELECT       top (@poc_zazn) id, nazov, pf, ulica, obec, okres, kraj, psc, stat, email, www, ico, ic_dph, dic, fax, tel, poznamka, dolezitost, region, reg_z_okresu
FROM            firmy_hlavna
WHERE        (nazov LIKE N'%' + @nazov + N'%') AND (ulica LIKE N'%' + @ulica + N'%') AND (obec LIKE N'%' + @obec + N'%') AND (ico LIKE N'%' + @ico + N'%') AND (stat = @stat)
                          AND (kraj = @kraj) AND (okres = @okres)

V formulari ladujem data do tabulky firmy_hlavna datasetu - ISPREDataset:

Me.Firmy_hlavnaTableAdapter.Fill_vyber(Me.ISPREDataSet.firmy_hlavna, _
                                            Convert.ToInt32(poc_zazn.Text), _
                                            nazov_f.Text, _
                                            ulica_f.Text, _
                                            obec_f.Text, _
                                            ico_f.Text, _
                                            stat_f.SelectedValue, _
                                            kraj_f.SelectedValue, _
                                            okres_f.SelectedValue)

Vsetko je ok, ale ako to mam urobit ak niektoru vyb. podmienok nechcem pouzit? Napr. aby vyber podla pola "ulica" nebol uplatneny a do vysledku isli vysledky bez uplatnenia tejto podmienky.

Doteraz som pouzival netypovane datasety a tam som si vytvoril sql podmienku aku som chcel.

Karol

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

V dotaze testovat NULL hodnoty:

SELECT top (@poc_zazn) id, nazov, pf, ulica, obec, okres, kraj, psc, stat, email, www, ico, ic_dph, dic, fax, tel, poznamka, dolezitost, region, reg_z_okresu
  FROM firmy_hlavna
 WHERE (nazov LIKE N'%' + @nazov + N'%' OR @nazov IS NULL)
   AND (ulica LIKE N'%' + @ulica + N'%' OR @ulica IS NULL)
   AND (obec LIKE N'%' + @obec + N'%' OR @obec IS NULL)
   AND (ico LIKE N'%' + @ico + N'%' OR @ico IS NULL)
   AND (stat = @stat OR @stat IS NULL)
   AND (kraj = @kraj OR @kraj IS NULL)
   AND (okres = @okres OR @okres IS NULL)

a při předání parametrů je potřeba prázdné string hodnoty převést na DBNull.Value

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

Super, to ma nenapadlo, chodi to.

Ale este otazka,tie null hodnoty ma hnevaju, vzdy to chce nejaky iny zapis.

Skusam toto:

Me.Firmy_hlavnaTableAdapter.Fill_vyber(Me.ISPREDataSet.firmy_hlavna, _
                    Convert.ToInt32(poc_zazn.Text), _
                    IIf(nazov_f.Text = "", DBNull.Value, nazov_f.Text), _
                    IIf(ulica_f.Text = "", DBNull.Value, ulica_f.Text), _
                    IIf(obec_f.Text = "", DBNull.Value, obec_f.Text), _
                    IIf(ico_f.Text = "", DBNull.Value, ico_f.Text), _
                    IIf(stat_f.SelectedValue = 0, DBNull.Value, stat_f.SelectedValue), _
                    IIf(okres_f.SelectedValue = 0, DBNull.Value, okres_f.SelectedValue), _
                    IIf(kraj_f.SelectedValue = 0, DBNull.Value, kraj_f.SelectedValue))
nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Lepší je testovat prázdné string hodnoty funkcí String.IsNullOrEmpty(), tedy:

IIf(String.IsNullOrEmpty(nazov_f.Text), DBNull.Value, nazov_f.Text)

no a jinak je ještě možnost si to vytáhnout do funkce:

Public Shared Function ToDBNull(value As String) As Object
	If String.IsNullOrEmpty(value) Then
		Return DBNull.Value
	End If

	Return value
End Function

ale víc s tím už asi nepůjde udělat.

Problém je totiž obecně v tom, že datasety nepodporují nullable typy a null (nothing) hodnoty, takže se tam musí pro NULL v databázi používat to DBNull.Value a proto všechno pak musí být typu Object, prostě hrůza. A u typových datasetů je to ještě horší, tam se pak nedají používat vlastnosti a musí se používat metody IsMyFieldNull() a SetMyFieldNull().

V podstatě toto byl jeden z hlavních důvodů proč jsem datasety přestal používat už před několika lety. Ten druhý důvod je špatná udržovatelnost kódu.

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

Chybova hlaska je:

Conversion from type 'DBNull' to type 'String' is not valid.

Toto vyzera, ze nechce zobrat dbnull.value ako hodnotu.

Skusil som:

Me.Firmy_hlavnaTableAdapter.Fill_vyber(Me.ISPREDataSet.firmy_hlavna, _
   Convert.ToInt32(poc_zazn.Text), _
   IIf(String.IsNullOrEmpty(nazov_f.Text), DBNull.Value, nazov_f.Text), _
   IIf(String.IsNullOrEmpty(ulica_f.Text), DBNull.Value, ulica_f.Text), _
   IIf(String.IsNullOrEmpty(obec_f.Text), DBNull.Value, obec_f.Text), _
   IIf(String.IsNullOrEmpty(ico_f.Text), DBNull.Value, ico_f.Text), _
   IIf(stat_f.SelectedValue = 0, DBNull.Value, stat_f.SelectedValue), _
   IIf(okres_f.SelectedValue = 0, DBNull.Value, okres_f.SelectedValue), _
   IIf(kraj_f.SelectedValue = 0, DBNull.Value, kraj_f.SelectedValue))

Polia stat_f,okres_f,kraj_f su combo a ked je v nich hodnota 0, potrebujem aby to zmenilo na NULL.

Polia v tabulke su INT .

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

Tak jinak, metoda Fill u typového TableAdapteru v sobě převod null (nothing) na DBNull.Value už má.

Takže je potřeba převádět na Nothing:

Me.Firmy_hlavnaTableAdapter.Fill_vyber(Me.ISPREDataSet.firmy_hlavna, _
       Convert.ToInt32(poc_zazn.Text), _
       IIf(NullIfEmpty(nazov_f.Text), _
       IIf(NullIfEmpty(ulica_f.Text), _
       IIf(NullIfEmpty(obec_f.Text), _
       IIf(NullIfEmpty(ico_f.Text), _
       IIf(NullIfEmpty(stat_f.SelectedValue), _
       IIf(NullIfEmpty(CInt(okres_f.SelectedValue), _
       IIf(NullIfEmpty(CInt(kraj_f.SelectedValue))

Private Shared Function NullIfEmpty(value As String) As String
        If String.IsNullOrEmpty(value) Then
            Return Nothing
        End If

        Return value
    End Function

    Private Shared Function NullIfEmpty(value As Integer) As Nullable(Of Integer)
        If value = 0 Then
            Return Nothing
        End If

        Return value
    End Function
nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Toto funguje, vrela vdaka.

Presli ste na EF a spokojnost? Dobre tomu rozumiem?

Zacal som do EF pozerat ale zlakol som sa toho.

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

Sám pro malé a střední projekty používám EF 5 nebo 6 Code First (Code Only) přístup, tj. bez designera. Pro větší projekty si napíšu svojí databázovou vrstvu (z části generovanou vlastním generátorem). Ta pak používá pouze základní vrstvu ADO.NET, kde data načítám přímo přes reader a pro volání akčních dotazů používám Stored Procedury v SQL.

Nepoužívat datasety ještě nutně neznamená používat EF. I bez EF se dají napsat vlastní typové datové objekty, a budou lepší než datasety, protože mohou používat nullable typy a budou lépe udržovatelné.

nahlásit spamnahlásit spam 1 / 1 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