Můj kod i s tím dotazem.. dotaz je načten ve "string query"
private void Mestecka()
{
string query = "SELECT a.Nazev FROM Mesto a " +
"INNER JOIN OosbaMesto b ON a.Id = b.MestoId" +
"WHERE b.OosbaId = @OosbaId";
using (connection = new SqlConnection(connectionString))
using (SqlCommand commnad = new SqlCommand(query, connection))
using (SqlDataAdapter adapter = new SqlDataAdapter(commnad))
{
commnad.Parameters.AddWithValue("@OosbaId", OsobaListBox.SelectedValue);
DataTable MestoTable = new DataTable();
adapter.Fill(MestoTable);
MestoLiistBox.DisplayMember = "Nazev";
MestoLiistBox.ValueMember = "Id";
MestoLiistBox.DataSource = MestoTable;
}
}
Když ten stejný query zkusím udělat normálně v Microsoft SQL, tak mi to najde co potřebuji jediné co, tak tam na konci nepoužíji: WHERE b.OosbaId = @OosbaId... ale WHERE b.OosbaId = 1 (aby se to rovnalo Id co chci zrovna najít.
Podíval bych se jakého datového typu je SelectedValue u ListBoxu, tuším, že string. Moc jsem se nedíval, ale tuším, že v tabulkách v databázi id je int.
#4gna
Děkuji moc toho jsem si vůbec nevšiml a bylo to ono... už mi to vypisuje...
jen jsem myslel, že když pak kliknu na jiné jméno, než je to první, tak mi to vypíše při každém kliku na další jménoi jiné města... ale prostě se to spustí a zůstane tam ten první údaj z prvního jména i když vyberu jiné jméno, tak žádný update... :/ alespoň jsem tak myslel, že funguje SelectedValue po kliku
Ahoj, tak jsem to vše udělal a doplnil, ten SelectedIndex pomohl děkuji.. Pak jsem si tam přidal několik dalších věcí. Mám hotovo, ale trápí mě jedna taková, jakoby chyba kterou bych chtěl nějak ošetřit.
Pomocí spojovací tabulky "OosbaMesto" screeny k tomu jsou nahoře k těm tabulkám... tak mám funkci na přidání vybrané osoby do vybraného města kam chci osobu přidat, vše funguje... ale chtěl bych nějak ošetřit to, abych nemohl tu jednu osobu, kterou si vyberu přidat do toho města dvakrát. Zkoušel jsem to pomocí klasicky if else
Tak jsem se tím trochu prokousal a ty položky asi budou typu DataRow, který nedefinuje .Equals, takže je asi budeš must porovnat sám. Nebo třeba v databázi definovat constraint na unikátnost.
Pokud jde o to aby v získané sadě záznamů nebyly duplicity, použij seskupování. Pokud mají být záznamy v tabulce unikátní pak:
1. zkusil bych toho dosáhnout pomocí nastavení příslušných sloupců tabulky jako unikátní
2. Pokud se jedná o nějakou kombinaci sloupců, zkusil bych z nich vytvořit řetězec a ten ukládat do dalšího, unikátního sloupce. Jde na to použít autogenerated column nebo
3. Zjistil bych, jestli je mnou vkládaný záznam unikátní tak, že bych zjistil počet kolidujících záznamů pomocí COUNT(). Pokud je unikátní, COUNT() vrátí 0, vložil bych ho. Prováděl bych to uvnitř transakce nebo before insert triggeru.
Tak jsem našel jednodušší způsob pomocí SQL dotazu v programu.
private void Mestecka()
{
string query = "SELECT DISTINCT a.Jmeno FROM Oosba a " +
"INNER JOIN OosbaMesto b ON a.Id = b.OosbaId " +
"WHERE b.MestoId = @MestoId";
using (connection = new SqlConnection(connectionString))
using (SqlCommand commnad = new SqlCommand(query, connection))
using (SqlDataAdapter adapter = new SqlDataAdapter(commnad))
{
commnad.Parameters.AddWithValue("@MestoId", MestoListBoxAll.SelectedValue);
DataTable OosbaTable = new DataTable();
adapter.Fill(OosbaTable);
MestoLiistBox.DisplayMember = "Jmeno";
MestoLiistBox.ValueMember = "Id";
MestoLiistBox.DataSource = OosbaTable;
}
}
Přidal jsem hned za SELECT ve string query DISTINCT... který funguje, tak že odmaže automaticky duplikovanou hodnotu a.Jmeno v ListBoxu... takže takto to bude asi v pohodě.
Select distinct nezabrání duplicitě v tabulce samotné, pouze duplicitu odstraní ve výsledném recordsetu.
Pokud chci, aby do sloupce tabulky nešla vložit duplictní hodnota, nastavím sloupec tabulky jako unikátní v definici tabulky ať při jejím vytváření nebo její změně.
Viz bod 2. v #15. Z obsahu obou sloupců udělat řetězec, např. Ostrava a Jenda složíš dohromady jako "OstravaJenda" a vkládáš do pomocného sloupce tabulky. DB to může dělat sama, hledej autogenerated column. A ten uděláš unikátní. A pak může být vložen jen jeden Jenda v Ostravě. Nebo podle bodu 3 zjistit, kolik existuje záznamů s daty Ostrava a Jenda a pokud neexistuje žádný, tak pak bude právě vložený záznam unikátní.