Diskuze: Combobox s podmienkou
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj,
cmd1.CommandText = "select Meno from Zoznam where Pohlavie=@pohlavie";
cmd1.Parameters.AddWithValue("@pohlavie", x);
V tomto případě ti i SqlParameter "detekuje" typ hodnoty x a správně je předá SQL.
PS: combobox pro zobrazení předaných hodnot volá .ToString(), proto se ti text zobrazuje v combu dobře.
Ahoj
ďakujem za odpoveď, snažím sa porozumieť tomu čo si mi poradil a skutočne
premenná X je typu string a Pohlavie pri testovaní v comboboxe je class . Len
zaujímavé je že aj premenná x a aj comboHodnota je typu string (vidím to
pri písaní tak ako si mi radil) a aj keď si to upravím a pridám
SqlParameter funguje to správne len s premennou x, s premennou comboHodnota to
zobrazuje prázdny výber.
Zkus si třeba do MessageBoxu nechat vypsat, co ti vlastně ta tvoje "comboHodnota" vrací
Jasne. Ale nam by spis pomohlo videt i ten text, co ti to vypisuje. Treba tam mas preklep. Male velke pismenko nebo tak. A nebo primo si nech vypsat ten sql prikaz.
string x = "Muz";
cmd1.CommandText = "select Meno from Zoznam where Pohlavie='"+x+"'";
vypis (cmd1.CommandText)
cmd1.CommandText = "select Meno from Zoznam where Pohlavie='"+comboHodnota+"'";
vypis (cmd1.CommandText)
Podle toho kodu, co jsi poslal, se comboHodnota naplnuje az spustenim
funkce
comboPohlavie_SelectedIndexChanged, ktera se v tom kodu ale nespousti. Takze
by to melo byt prazdne.
A pro zapis sql prikazu bych pouzival konstrukci ala Don. Tam jde o to, ze si udela escapovani parametru sam. To je lepsi, nez nedelat ho vubec, jako to mas ty a spolehat se na bozi pomoc. Jakoze, pokud bys udelal hack typu
string x = "Muz' OR '1'='1";
cmd1.CommandText = "select Meno from Zoznam where Pohlavie='"+x+"'";
Tak ziskam kompletni vypis databaze nebo muzu spustit prikaz v prikazu...
string x = "Muz' OR (DELETE Zoznam) OR '1'='1";
Oddebuguj/odkrokuj to a popiš, kde (proměnná/properta, řádek, ...) jsou neočekávané hodnoty.
Naplnění toho druhého comboboxu musíš provádět v události změny toho prvního
private void comboPohlavie_SelectedIndexChanged(object sender, EventArgs e)
{
//uloží do comboHodnota hodnotu zvolenú v comboboxe Pohlavie + vypíše pre kontrolu do TextBoxu
comboHodnota = comboPohlavie.Text;
tbPohlavie.Text = comboHodnota;
comboMena.Items.Clear();
con.Open();
SqlCommand cmd1 = con.CreateCommand();
cmd1.CommandType = CommandType.Text;
cmd1.CommandText = "select Meno from Zoznam where Pohlavie='"+comboHodnota+"'";
cmd1.ExecuteNonQuery();
DataTable dt1 = new DataTable();
SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
da1.Fill(dt1);
foreach (DataRow dr1 in dt1.Rows)
{
comboMena.Items.Add(dr1["Meno"]);
}
}
Ten tvůj kód jsem pouze zkopíroval a teď jsem si všimnul, že tam
nemáš uzavřené spojení s DB.
A hlavně, měl bys používat "parametrizované" dotazy
místo:
SqlCommand cmd1 = con.CreateCommand();
cmd1.CommandType = CommandType.Text;
cmd1.CommandText = "select Meno from Zoznam where Pohlavie='"+comboHodnota+"'";
to napiš třeba takto:
SqlCommand cmd1 = new SqlCommand("SELECT Meno FROM Zoznam WHERE Pohlavie = @pohlavie", con);
cmd1.Parameters.AddWithValue("@pohlavie", comboHodnota);
Ušetříš tím psaní kódu a vyhneš se SQL injection problémům...
Ahojte
ďakujem za pomoc a rady. Medzičasom po mnohých pokusoch som aj ja prišiel na
to že to musím robiť ako mi to píšete tu vyššie. A samozrejme tiež si
nechám poradiť a budem písať kód tak ako mi radíte, aby som sa vyhol
problémom SQL injection
SqlCommand cmd1 = new SqlCommand("SELECT Meno FROM Zoznam WHERE Pohlavie = @pohlavie", con);
cmd1.Parameters.AddWithValue("@pohlavie", comboHodnota);
Aspoň som sa naučil zase niečo nové ohľadom SQL injection.
Ďakujem ešte raz za všetky Vaše príspevky.
Áno funguje to už presne tak ako som si to predstavoval. Teraz sa už
trápim zase s iným
problémom, ale najskôr sa vždy pokúsim si to sám vyriešiť, poobzerať sa
po nete a až potom ak už všetko stroskotá napíšem sem. Pokúšam sa
urobiť si aplikáciu do práce ktorá by mi mala ušetriť kopu času a
zbytočnej námahy. Zatiaľ ti Michal a aj všetci ostatný ktorý sem prispeli
ďakujem.
Zobrazeno 12 zpráv z 12.