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.
Člen
Zobrazeno 13 zpráv z 13.
//= 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.
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.
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íš
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
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 .
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.
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.
"...program bude používat více lidí najednou a nesmí se stát, aby se více lidem objevily dvě stejná čísla..."
Vidím v tom spíš chybu v návrhu a dokud nenapíšeš, k čemu to vlastně potřebuješ, nemám jak poradit.
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).
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.
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.
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();
}
Zobrazeno 13 zpráv z 13.