Využij akce až 80 % zdarma při nákupu e-learningu. Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu
python week
Avatar
M6692
Člen
Avatar
M6692:14.6.2020 20:36

Ahojte, už druhý deň sa trápim pravdepodobne s jednoduchým problémom. Mám dva comboboxy ktoré plním z databáz. V prvom vyberiem pohlavie a v druhom mi má ponúknuť mená podľa zvoleného pohlavia.

   comboPohlavie.Items.Clear();
    con.Open();
    SqlCommand cmd = con.CreateCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "select Pohlavie from Zoznam_pohlavie";
    cmd.ExecuteNonQuery();
    DataTable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dt);

    foreach (DataRow dr in dt.Rows)
    {
        comboPohlavie.Items.Add(dr["Pohlavie"]);
    }
    con.Close();



    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"]);
    }
}


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;
}

Zkusil jsem: V comboboxe mena mi dáva prázdny výber. Skúšal som si vytvoriť pomocnú premennú <x> a do nej keď som vložil pohlavie priamo a dal to do podmienky tak to funguje

string x = "Muz";
.....
 cmd1.CommandText = "select Meno from Zoznam where Pohlavie='"+x+"'";
....

Chci docílit: Problém bude pravdepodobne vo formátovaní no skúšal som už všetko čo som našiel na nete no nedarí sa mi prísť na to aký má byť správny zápis.
Ďakujem

 
Odpovědět
14.6.2020 20:36
Avatar
Odpovídá na M6692
don.jarducius:14.6.2020 22:12

Ahoj,

  1. problém je nejspíš v tom, že tvoje testovací proměnná x je string, kdežto comboHodnota bude object. Což ti zcela určitě říká i našeptávač při psaní kódu.
  2. Nauč se SqlCommand používat od začátku správně a důsledně a pro předávání proměnných do SQL používat SqlParameter. Vyvaruješ se tím dost nepříjemnému SQL Injection. SqlParameter ti totiž "Escapuje" vkládané hodnoty.
cmd1.CommandText = "select Meno from Zoznam where [email protected]";
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.

Nahoru Odpovědět
14.6.2020 22:12
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
M6692
Člen
Avatar
M6692:15.6.2020 15:11

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.

 
Nahoru Odpovědět
15.6.2020 15:11
Avatar
Odpovídá na M6692
Michal Štěpánek:15.6.2020 21:28

Zkus si třeba do MessageBoxu nechat vypsat, co ti vlastně ta tvoje "comboHodnota" vrací

Nahoru Odpovědět
15.6.2020 21:28
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
M6692
Člen
Avatar
M6692:15.6.2020 21:32

Ahoj,
dávam si to vypisovať do textboxu a vracia presne to čo má čiže názov pohlavia.

tbPohlavie.Text=comboHodnota;
Editováno 15.6.2020 21:33
 
Nahoru Odpovědět
15.6.2020 21:32
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16.6.2020 8:02

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_Se­lectedIndexChan­ged, 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";

 
Nahoru Odpovědět
16.6.2020 8:02
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
zelvicek
Člen
Avatar
Odpovídá na M6692
zelvicek:16.6.2020 15:10

Oddebuguj/odkrokuj to a popiš, kde (proměnná/properta, řádek, ...) jsou neočekávané hodnoty.

 
Nahoru Odpovědět
16.6.2020 15:10
Avatar
Odpovídá na M6692
Michal Štěpánek:16.6.2020 16:02

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"]);
    }
}
Nahoru Odpovědět
16.6.2020 16:02
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na M6692
Michal Štěpánek:16.6.2020 16:13

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...

Nahoru Odpovědět
16.6.2020 16:13
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
M6692
Člen
Avatar
M6692:19.6.2020 13:19

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.

 
Nahoru Odpovědět
19.6.2020 13:19
Avatar
Odpovídá na M6692
Michal Štěpánek:19.6.2020 14:08

A už ti to funguje?

Nahoru Odpovědět
19.6.2020 14:08
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
M6692
Člen
Avatar
M6692:19.6.2020 18:01

Á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.

 
Nahoru Odpovědět
19.6.2020 18:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.