Příkaz SELECT s parametry   zodpovězená otázka

C#, SQL, Databáze

Zdravím,

Používám Visual Studio 2008 a SQL Server 2005.

Můj problém je ohledně dotazu na databázi, aby mi podle určitých paramertů vypsal určitá data.

Jde o to, že uživatel si vybere podle čeho hledat (sloupec v DB) a následovně zadá hodnotu kterou hledat

Takže zadá v jakým sloupci (řešeno přes radiobutton) a jakou hodnotu (textBox, comboBox, atd.)

Pokud klidnu na button hledat, neudělá to nic, nenajde určenou hodnotu a když sem si ty hodnoty, které chci hledat, vypsal do labelu, tak se hodnoty ukázaly, takže bude někde problém v komunikaci s DB.

zde je kod:

       i = 0;
                SqlConnection sqlConnection = new SqlConnection(Connectionstring); // inicializace objektu spojení na databázi
                sqlConnection.Open(); // pomocí dat z ConnectionStringu spojení otevřeme
                SqlCommand sqlCommand = new SqlCommand("SELECT [Nazev] FROM [Films] WHERE @sloupec = @hodnota", sqlConnection); // vytvoření dotazu a předání připojení
                sqlCommand.Parameters.AddWithValue("@sloupec", hledat);
                sqlCommand.Parameters.AddWithValue("@hodnota", dotaz);

                //   sqlCommand.Parameters.AddWithValue("@zaznam", zaznam); // přidat parametr do dotazu


                SqlDataReader dataReader = sqlCommand.ExecuteReader(); // spuštění dotazu a vytvoření objektu na čtení řádků

                // smyčka na čtení záznamů
                while (dataReader.Read()) // posun na další řádky, dokud jsou k dispozici
                {
                    listBox1.Items.Add(i);
                    listBox1.Items[i] = dataReader["Nazev"];
                    i++;
                }

                dataReader.Close(); // nejdříve uzavřeme aktuální dotaz
                sqlConnection.Close(); // a pak i spojení

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

Chyba je v tom, že parametry nemůžou reprezentovat sloupec, jen hodnotu.

Pokud chcete jméno sloupce měnit dynamicky, tak bude potřeba přímo měnit SQL text dotazu. Jen si dejte pozor, aby nešlo zadat jméno sloupce přímo - to by bylo velké bezpečnostní riziko.

Dosavadní kód bude testovat, jestli je hodnota identická se jménem sloupce, nikoliv s jeho opravdovou hodnotou.

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

To @sloupec = @hodnota mi příjde divné, tak to asi fungovat nebude. Celkově to chce poupravit. Parametry se používají když voláte proceduru (dotaz) který je uložen na serveru. Zavoláte ho jménem a předáte požadované parametry. Takže dotaz pak vypadá třeba takto:

            With mujDotaz
                .Connection = spojeni
                .CommandType = CommandType.StoredProcedure
                .CommandText = "QRY_moje_ulozena_procedura"

                .Parameters.Add("id", SqlDbType.Int).Direction() = ParameterDirection.Input
                .Parameters("id").Value = id
            End With

Je to psáno ve VB ale pro demonastraci to snad postačí.

No a na serveru máte proceduru která se jmenuje QRY_moje_ulozena_procedura kde je třeba:

Select * from mojeTable where id=@id

Tak jak to píšete vy by to šlo s úpravou. Místo parametrů se zavináčem dosadíte proměnné a SQL dotaz si poskládáte. Ale to bych nedoporučoval, je to bezpečnostní riziko.

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

Tady snad uložená procedura potřeba není (pro demonstrační účely). On by kód fungoval, jen nejde parametrem definovat název sloupce.

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

No, když teda nejde definovat sloupec, ale jen hodnotu, nešlo by to udělat přes case?

např.

case .... of

1: Select z týhle tabulky

2: Select z týhle tabulky

atd?

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

To by určitě šlo. Ale tazatel chtěl filtrování i podle sloupců. Ve výsledku by mohl mít 50 selectů, což je zbytečné a nehezké. Pokud ověří, že jméno sloupce je povolené, pak nevidím problém ve skládání dotazu, například:

Dim sql As String = "select * from [Tabulka] where [" + jmenoSloupce + "] = @hodnota"

Ale jak jsem psal, musí být nutné ověření, že sloupec existuje! To můžeme udělat i třeba přímo databází dotazem:

select COUNT(*) from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @jmenoTabulky and COLUMN_NAME = @sloupec

Pokud nevrátí hodnotu 0, máme jistotu, že sloupec v dané tabulce opravdu existuje a můžeme z něj i složit SQL dotaz.

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

Ja mam podobny problem.

Ale v aplikacii ktoru programujem sú vsetky SQL prikazy uložené ako StoredProcedures na SQL serveri. Takže nemam ako ten prikaz menit ako piše Tomáš. Nechcem to ani robit cez CASE lebo by sa musela vždy po pridani ci odobrani stlcov menit aj StoredPrecedura manualne.

Da sa to nejako programovo urobiť priamo v uloženej procedure ked posielam ako parameter MenoStlpca a hodnotu?

Dakujem

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