NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
IT rekvalifikace s podporou uplatnění. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!

Diskuze: C# a MySQL - select, update

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

Aktivity
Avatar
Kuba5
Člen
Avatar
Kuba5:22.5.2013 16:00

Ahoj, jsem v C# začátečník a tvořím jeden program, ale potřeboval bych pomoc.
V MySQL databázi mám v tabulce cca 50 záznamů se sloupcem numbers, kde jsou prostě čísla a druhý sloupec s názvem used, kde je jen 0 a 1. 0 znamená, že to číslo ještě nebylo použito.
V programu mám potom jeden textbox, kde se ukazuje číslo z databáze, jak jsem psal výše a jedno tlačítko s názvem DALŠÍ.

  1. Kliknu na DALŠÍ a v textboxu se má ukázat číslo z databáze (numbers), u kterého je used 0 (ještě nebylo použito).

Číslo se tedy ukáže a v databázi se u něj updatne sloupec used na 1 (již bylo použito.

  1. Kliknu na tlačítko DALŠÍ, v textboxu se objeví další číslo v pořadí, u kterého je used 0 (čísla by se měly radit od nejmenší po největší po jednom) a opět se u něj zapíše used 1.
  2. Takhle pořád dokola cca 50x, potom se zase u všech čísel (numbers) nastaví used na 0.

Nevím jak to napsat, aby to šlo dobře pochopit, ale takhle se to snad pochopit dá. Ještě proč tam musí být to used 0 a 1... program bude používat více lidí najednou a nesmí se stát, aby se více lidem objevily dvě stejná čísla.

Už mám funkční MySQL spojení a třeba insert, select i update mi funguje, ale nevím jak to udělat , ABY v SELECT bylo, že se má ukázat jen jedno číslo v pořadí, kde je used 0 a ne všechny, kde je used 0.
U update bych potom nějak zapsal SET "used na 1" WHERE "textbox", nevím jestli by to takhle brát přímo z textboxu šlo, ale problém je hlavně u Select.

Budu rád za každou radu. Předem moc děkuji. :)

 
Odpovědět
22.5.2013 16:00
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kuba5
Kit:22.5.2013 16:26

To sis jako začátečník vzal docela náročné sousto. Osobně bych se takovému algoritmu vyhnul velkým obloukem a udělal to úplně jinak. Záleží však na tom, čeho chceš dosáhnout.

Nahoru Odpovědět
22.5.2013 16:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Honza Bittner
Tvůrce
Avatar
Honza Bittner:22.5.2013 16:28

koukni se na http://www.itnetwork.cz/php/mvc a na http://www.itnetwork.cz/php/zaklady
.... z toho se to naučíš a vše pochopíš :)

Nahoru Odpovědět
22.5.2013 16:28
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kuba5
David Hartinger:22.5.2013 16:39

Je to jednoduché, stačí použít ORDER BY a LIMIT. Nevím, proč tě HoBi odkázal na PHP, ale zde si přečti o MySQL dotazech a najdi si tam jak funguje LIMIT a ORDER BY: http://www.itnetwork.cz/…ze-tutorialy

Nahoru Odpovědět
22.5.2013 16:39
New kid back on the block with a R.I.P
Avatar
Kuba5
Člen
Avatar
Kuba5:22.5.2013 16:44

Díky všem. Upřímně PHP umím víc než C#, ale už je to hodně dlouho, co jsem používal SQL, takže na LIMIT jsem si nevzpomněl.
Přes ORDER BY a LIMIT by to mělo jít, jdu to vyzkoušet a uvidím.
btw. konečně jsem našel skvělé fórum o programování, kde je fajn komunita :).

 
Nahoru Odpovědět
22.5.2013 16:44
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:22.5.2013 16:51

ORDER BY a LIMIT řeší jen vyhledávání. Při UPDATE však může dojít k souběhu, kterému se Kuba5 chce vyhnout.

Nahoru Odpovědět
22.5.2013 16:51
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:22.5.2013 17:26

Ze zadání nevyplývá, že by aplikaci používalo více lidí najednou nebo že by to měl nějakým způsobem řešit. Může to dát do transakce, ale IMHO to nepotřebuje řešit.

Nahoru Odpovědět
22.5.2013 17:26
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:22.5.2013 17:30

"...program bude používat více lidí najednou a nesmí se stát, aby se více lidem objevily dvě stejná čísla..."

Nahoru Odpovědět
22.5.2013 17:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kuba5
Člen
Avatar
Kuba5:22.5.2013 18:11

No je to tak. Chtělo by to nějak uložit to co vyleze ze Select a to pak dát do insert (WHERE "to o čem mluvím").
btw. nejde v SQL příkazu v inser zadat řada čísel? Např. od 2100 do 2199, nebo to musím psát po jednom? Díky.

 
Nahoru Odpovědět
22.5.2013 18:11
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kuba5
Kit:22.5.2013 18:16

Vidím v tom spíš chybu v návrhu a dokud nenapíšeš, k čemu to vlastně potřebuješ, nemám jak poradit.

Nahoru Odpovědět
22.5.2013 18:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kuba5
Člen
Avatar
Odpovídá na Kit
Kuba5:22.5.2013 18:27

Mělo by to sloužit jako "přidělovač čísel" uživatelům aplikace. Těch čísel je omezený počet a čísla jsou daná (v tomhle případě jsou uložená v databázi). Každý uživatel ale musí dostat jiné číslo. Jinak to neprobíhá rychle, program se používá občas.
Jasně, že by stačilo k aplikaci přiložit textotvý soubor, tam napsat čísla a hotovo, ale to nejde, protože jak už jsem řekl, nemělo by se stát, aby měli dva uživatelé stejné číslo.
Bylo by to už vyřešené, kdybych věděl, jak si poradit s tím UPDATEM(nastavení used na 1).

Editováno 22.5.2013 18:29
 
Nahoru Odpovědět
22.5.2013 18:27
Avatar
Kuba5
Člen
Avatar
Kuba5:24.5.2013 19:24

Ještě bych potřeboval poradit, jak definovat to číslo, které jsme vybrali přes SELECT, abych ho potom mohl použít v UPDATE. Nejde brát to číslo z labelu, protože v labelu mám číslo třeba 6132, kliknu na tlačítko, provede se jen UPDATE a u tohoto čísla (6132) se zapíše used = 1. Kliknu znovu na tlačítko a ukáže se konečně další číslo (6133), ale zase ten stejný koloběh.
Zkrátka mi jde o to, že se obě operace (UPDATE starého čísla, které je v labelu a následně SELECT čísla, kde je used = 0).
Jak toho prosím docílit? Jsem v C# fakt začátečník a tak pořád jen zkouším, zkouším, kódy samozřejmě nevypadají dobře, ale za to mi teď prosím nenadávejte. :D
Ještě se trošku vrátím k tomu řešení. Chápu, že to není nejlepší řešení, ale zatím bude dostačovat, ono až tolik vadit nebude, když budou mít 2 uživatelé stejné číslo, brzy to zjistí a prostě někdo klikne na tlačítko znovu a už to bude ok.

Tady kód:

private void button1_Click(object sender, EventArgs e)
 {

     string input = label1.Text.Trim();
     string conn = "server=46.28.110.147;user=________;password=_____;database=_______;";
     MySqlConnection myconn = new MySqlConnection(conn);
     string sql = "SELECT numbers FROM domestic WHERE used=0 ORDER BY numbers LIMIT 1";
     string sq2 = "UPDATE domestic SET used = 1 WHERE numbers = '" + label1.Text +"'";
     MySqlDataAdapter da = new MySqlDataAdapter(sql, myconn);
     MySqlCommand cmd = new MySqlCommand(sq2, myconn);
     DataTable dt = new DataTable();
     da.Fill(dt);


     if (dt.Rows.Count == 0)
     {
         MessageBox.Show(input + "Error", "Error");
     }
     else
     {

         myconn.Open();

         cmd.ExecuteNonQuery();

         myconn.Close();


         label1.Text = dt.Rows[0][0] + "";


     }

 }

Díky.

 
Nahoru Odpovědět
24.5.2013 19:24
Avatar
Kuba5
Člen
Avatar
Kuba5:24.5.2013 21:05

Vyřešeno:

private void button1_Click(object sender, EventArgs e)
{
    string input = label1.Text.Trim();
    string conn = "server=46.28.110.147;user=;password=;database=;";
    MySqlConnection myconn = new MySqlConnection(conn);
    string sql = "SELECT numbers FROM domestic WHERE used=0 ORDER BY numbers LIMIT 1";
    MySqlDataAdapter da = new MySqlDataAdapter(sql, myconn);
    DataTable dt = new DataTable();
    da.Fill(dt);

    label1.Text = dt.Rows[0][0] + "";

    string sq2 = "UPDATE domestic SET used = 1 WHERE numbers = '" + label1.Text + "'";
    MySqlCommand cmd = new MySqlCommand(sq2, myconn);
    myconn.Open();
    cmd.ExecuteNonQuery();
    myconn.Close();
}
 
Nahoru Odpovědět
24.5.2013 21:05
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 13 zpráv z 13.