c# předání dat z DB

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
lelekdk
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. črc 2009
Bydliště: Brno

c# předání dat z DB

Příspěvek od lelekdk »

Mám vytvořenou MySQL DB

ID - nějaké pořadové číslo uživatele
jmeno - Jméno uživatele
konst1 - konstanta jedna (double)
konst2 - konstanta dvě (double)
konst3 . konstanta tři (double)

aplikace v prvním okně má textbox (pro vložení jména uživatele) a button pro "přihlášení uživatele"

odešlu následující dotaz do DB:

Kód: Vybrat vše

MySqlCommand(" select jmeno, konst1, konst2, konst3 from uzivatele.info where jmeno='" + txtuzivatel.text + "' ;", conDataBase);
tedy pro konkrétního uživatele pokud existuje v BD dostanu konst1, konst2 a konst3 (každý uživatel má přiřazené unikátní konstanty)

Kód: Vybrat vše

string uzivatel = Reader.GetString("jmeno");
double konstanta1 = Convert.ToInt32(Reader.GetDouble("konst1"));
...
...
první okno se zavře a otevře se druhé okno ve kterém je NumericUpDown a button

po stisknutí tlačítka se provede operace:
numericUpDown + konst1 + konst2 + konst3 a do labelu vypíšu Jméno přihlášenéhého uživatele a jeho výsledek

Jak ideálně přenést 3 konstaty a jméno uživatele do druhého Form?

zatím jsem vyzkoušel tohle:

Kód: Vybrat vše

this.Hide();
Form2 form_work = new Form2(uzivatel,konstanta1,konstanta2,konstanta3);
form_work.ShowDialog();
a do druhého formu jsem to zapsal takto:

Kód: Vybrat vše

public Form2(string UzivatelJmeno, double konst_1, double konst_2, double konst_3)
{
InitializeComponent();
}
ale pak už mi nejde s tím dále pracovat

Zkoušel jsem postup get set, ale tem mi moc dobře nešel (pravděpodobně jsem špatně pochopil). Nějaká rada jak násleně pracovat se získanými daty dále v druhém okně? Pro začátek tam mám jen numericUpDown, ale později výpočtů bude více. Představa je taková, že se načtou hodnoty a já je budu moci kdykoliv použít ve výpočtech bez přístupu k první DB. Ta slouží pouze jako zdroj konstant.

Děkuji.
c# Kozel zahradníkem
Exp
Začátečník
Začátečník
Registrován: 24. črc 2004
Bydliště: Tábor
Kontaktovat uživatele:

Re: c# předání dat z DB

Příspěvek od Exp »

Možná sem dej radši kód.
Můžeš mít třeba nějakou třídu, která bude držet public properties pro "globální" použití a pak načítat hodnoty z takové třídy odkudkoli.
lelekdk
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. črc 2009
Bydliště: Brno

Re: c# předání dat z DB

Příspěvek od lelekdk »

Jsem dal skoro celý kód z form1 :D

Kód: Vybrat vše

private void btn_uzivatel(object sender, EventArgs e)
{
try
{
MySQL dotaz
string...
double...
double...
double...
this.hide()
form2...(uzivatel,konstanta1,konstanta2,konstanta3)
open nového okna
Vše je již výše uvedeno. Části kódu, kde se připojuji k databázi a ukončuji připojení k DB opravdu není nutné přikládat a jen to znepřehlední dotaz. Opravdu více kódu, krom toho připojení k DB, který jsem neuvedl, tam opravdu není.

Zatím nemám žádnou takovou třídu.
c# Kozel zahradníkem
Exp
Začátečník
Začátečník
Registrován: 24. črc 2004
Bydliště: Tábor
Kontaktovat uživatele:

Re: c# předání dat z DB

Příspěvek od Exp »

Tak jestli máš vše v jedný třídě, stačí si udělat ty nově generovaný formy jako class properties a inicializovat je až ve chvíli, kdy je potřeba.

Takže si jako třídní vlastnosti nadefinuj

Form Form2 { get; set; }

a pak až budeš chtít vytvořit ten form

this.Form2 = new Form(args);

Za args dosadíš co potřebuješ.
lelekdk
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. črc 2009
Bydliště: Brno

Re: c# předání dat z DB

Příspěvek od lelekdk »

Už jsem psal, že s get set jsem měl problém. nevím jak to pravděpodobně dobře zapsat, když mi to nešlo...

s form2 chci později úplně samostatně pracovat. já tam jen potřebuji protlačit konstantu jedna až tři + název uživatele pro pozdější kontrolu.
c# Kozel zahradníkem
Exp
Začátečník
Začátečník
Registrován: 24. črc 2004
Bydliště: Tábor
Kontaktovat uživatele:

Re: c# předání dat z DB

Příspěvek od Exp »

No, řešení už sem ti napsal, nevim co víc chceš...
Jestli máš všechno v jedný třídě, tak ten form2 musíš mít jako třídní vlastnost.
Pokud ne, tak stačí vytvořit další třídu, ve který si nadefinuješ public vlastnosti, který budeš moct nastavit a získat z jakýkoli třídy.
lelekdk
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. črc 2009
Bydliště: Brno

Re: c# předání dat z DB

Příspěvek od lelekdk »

Tak jsem 3 konstanty a jméno protlačil takříkajíc na hulváta do druhého okna stylem: okno jedna říká, že má tyhle čísla (z dotazu ro MySQL), tak si je okno 2 laskavě zapiš. Okno 2 si je natvrdo zapíše a pak s nima pracuje. Funguhe to zatím. Je to na 100 % špatné řešení, ale zatím funkční, když jiné řešení zatím neumím zapsat.

ještě pogůglím, případně pokud by někdo měl elegantní řešení, jak protlačit jméno uživatele a 3 konstanty do druhého okna, tak budu rád za konkrétní řešení.
c# Kozel zahradníkem
lelekdk
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. črc 2009
Bydliště: Brno

Re: c# předání dat z DB

Příspěvek od lelekdk »

našel jsem nějaký postup, který by měl být mnohem lepší než mnou uplatnění. Když zkouším postup podle druhého příspěvku, tak hned u var form2... mi to hází chybu.

Kód: Vybrat vše

var form2 = new Form2();
form2.Model = form1.Model;
form2.ShowDialog();
http://codereview.stackexchange.com/que ... ween-forms
c# Kozel zahradníkem
Exp
Začátečník
Začátečník
Registrován: 24. črc 2004
Bydliště: Tábor
Kontaktovat uživatele:

Re: c# předání dat z DB

Příspěvek od Exp »

Mas tam pouze tridu Form, tedy new Form2 je spatne, ma byt new Form. Nemas zaklady objektoveho programovani, to je ten problem. Nastuduj tedy OOP.
lelekdk
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. črc 2009
Bydliště: Brno

Re: c# předání dat z DB

Příspěvek od lelekdk »

Exp: nechci znít nevděčně, ale tvé rady mi nepomáhají. Přesto děkuji :)

Rámcově vím, o čem mluvíš, ale c# aplikace plácám po večerech ve volném čase, protože je to free dostupné pro každého. Proč to tedy nezkusit. Jestli máš narážky na mou neznalost, tak si je měj. Já vím, že k profesionálnímu projektu nikdy nedospěji, ale to mi nezabrání plácat dohromady moje neprofesionální udělátka.

Řešení jsem hledat, nenašel, které bych zvládnul splácat, tak jsem se obrátil s dotazem na toto fórum. Ideálně pokud by mi někdo poradil konkrétně a ne, že mi tu někdo bude hrotit a vyzdvihovat mou neznalost. Pomoc by byla lepší.

Ještě jednou děkuji za snahu a přeji mnoho úspěchů v profesionálním programování. na rozdíl ode mne :)
c# Kozel zahradníkem
Exp
Začátečník
Začátečník
Registrován: 24. črc 2004
Bydliště: Tábor
Kontaktovat uživatele:

Re: c# předání dat z DB

Příspěvek od Exp »

Kdyz ono se vazne tezko radi pokud tomu nerozumis ani trochu. Pokud chces, aby ti to nekdo napsal cely, musis sem hodit vsechen kod a doufat, ze se nekdo takovej najde. Ale znovu musim zopakovat, ze bez zakladu se v tomhle radi fakt tezko. Necham tedy rady na nekoho jinyho, treba ti to vysvetli lip. Bohuzel programovat, trebaze "for fun", s pristupem "mne se to ucit nechce, napiste mi to cely" lze jen velmi tezko. Narazky na neznalost rozhodne nemyslim jako invektivy, je to jen muj dojem. Snazis se skloubit databaze s modernim objektove orientovanym jazykem, ale neznas ani zakladni principy z proceduralniho programovani - to opet neni urazka, pouze poukazuju na to, ze na zacatek by to chtelo zkouset jednodussi veci a naucit se zakladni pojmy a principy.

Btw, ja se za profesionala rozhodne nepovazuju, jsem samouk stejne jako ty.

Jestli sem se te nejak dotknul tak to rozhodne nebylo v mem umyslu.
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: c# předání dat z DB

Příspěvek od webwalker »

@lelekdk: Nazdar chlape,
způsobů, jak to řešit je spousta. Ta nejjednodušší cesta je vytvoření globálních proměnných.
V souboru Program.cs si vytvoř novou statickou třídu Global s proměnnýma takto:

static class Global
{
public static string promenna1 = string.Empty;
public static int promenna2 = 0;
public static double promenna3 = 0;

// Defaultni prazdny konstruktor
static Global() {}
}

Kdekoliv v aplikaci (z jakéhokoliv okna) pak můžeš k těmto proměnným přistupovat (číst nebo zapisovat) takto:

Global.promenna1 = "Ahoj";
Global.promenna2 = 1;
Global.promenna3 = .5;

TextBox1.Text = Global.promenna1;
.
.

Dalším a lepším řešením ve spojení s databází jsou pak DataSety s následným DataBindingem do controlů jako jsou TextBoxy, NumericUpDown, ComboBoxy .... a už jsme zase u databindingu že :)

Další možností je předávat si odkazy jednoho okna do druhého (o to se zřejmě pokoušíš ty), ale není to to pravé ořechové.

Ono jde také o to, jakou tam máš organizaci těch oken. Form1 je zřejmě okno aplikace, které bys rozhodně schovávat neměl!!! Nebo je to organizováno jinak?
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
lelekdk
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. črc 2009
Bydliště: Brno

Re: c# předání dat z DB

Příspěvek od lelekdk »

Jak to mám zatím doteď...

Mám vytvořenou MySQL DB

ID - nějaké pořadové číslo uživatele
jmeno - Jméno uživatele
konst1 - konstanta jedna (double)
konst2 - konstanta dvě (double)
konst3 . konstanta tři (double)

Pak mám v c# vytvořené 2 okna.
první okno slouží pouze k získání konstant od konkrétního uživatele
druhé okno pak s těmito konstanty bude pracovat.

Postup jedna: řešil jsem pomocí konstruktoru:

kód byl asi takový:

Kód: Vybrat vše

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace ET
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btn_connectMySQL_Click(object sender, EventArgs e) // Button pro otevření pracovního okna
        {
            try
            {
                string constring= "datasource=localhost;port=3306;username=" + txt_Username.Text + ";password=114sdf56df464f12r3a487gjg5411";
                MySqlConnection conDataBase = new MySqlConnection(constring);
                MySqlCommand conDataBase  = string conDataBase = new MySqlCommand(" select jmeno, konst1, konst2, konst3 from uzivatele.info where jmeno='" + txt_Username.Text + "; conDataBase);
                MySqlDataReader Reader;
                conDataBase .Open();

                string Uzivatel = Reader.GetString("jmeno");
                double konstanta1= Convert.ToInt32(Reader.GetDouble("konst1"));
                double konstanta2= Convert.ToInt32(Reader.GetDouble("konst2"));
                double konstanta3= Convert.ToInt32(Reader.GetDouble("konst3"));

                this.Hide();
                Form2 form_work = new Form2(Uzivatel, konstanta1, konstanta2, konstanta3);
                form_work.ShowDialog();
                conDataBase .Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}
do druhého pak stačilo zapsat jen toto:

Kód: Vybrat vše

public Form2(string Uzivatel, double konstanta1, double konstanta2, double konstanta3)
        {
            InitializeComponent();
            // Pracovat s uživatelem a konstantou jde pouze zde, nikde jinde ve formuláři
            například: label1.text = Uzivatel; atd...
        }
jednoduhý pomocí konstruktoru, ale nepoužitelný pro celý formulář.

tak jsem se pustil do Properties, tedy přes to get set

něco takového vytvořím pro všechny 4 proměnné (uživatel a 3 konstanty...)

Kód: Vybrat vše

        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btn_connectMySQL_Click(object sender, EventArgs e) // Button pro otevření pracovního okna
        {
            try
            {
                string constring= "datasource=localhost;port=3306;username=" + txt_Username.Text + ";password=114sdf56df464f12r3a487gjg5411";
                MySqlConnection conDataBase = new MySqlConnection(constring);
                MySqlCommand conDataBase  = string conDataBase = new MySqlCommand(" select jmeno, konst1, konst2, konst3 from uzivatele.info where jmeno='" + txt_Username.Text + "; conDataBase);
                MySqlDataReader Reader;
                conDataBase .Open();

                string Uzivatel = Reader.GetString("jmeno");
                double konstanta1= Convert.ToInt32(Reader.GetDouble("konst1"));
                double konstanta2= Convert.ToInt32(Reader.GetDouble("konst2"));
                double konstanta3= Convert.ToInt32(Reader.GetDouble("konst3"));

                this.Hide();
                Form2 form_work = new Form2();
                form_work.Uzivatel  = Username; atd.. + ty 3 konstanty
                form_work.ShowDialog();
                conDataBase .Close();
a do druhého okna jsem to přenesl takto:

Kód: Vybrat vše

    public partial class Form2 : Form
    {
            public string Username
            {
                set { label1.Text = value; }
            }
Stále to mám zapsané jako v prvním případě, tedy do komponenty se kterou pak pracuji dále. Zápis do komponenty není správný. Pokud stisknu jiné tlačítko na druhém formu, tak prostě udělám to, že získám údaje z toho label1 což je špatný postup. funkční, ale špatně.

U get set řeším zatím to, že se label načte až jako poslední ve Form2. nebo mi to tak připadá, protože když ho zkusím hned nadefinovat k připojení k DB z Form2, tak to hodí error.

hlavně bych pak rád druhý form propojil s další DB. z té první si uživatel přenese základní informace potřebné jednak ke spojení s jeho přidělenou DB a pak mimo jiné ty unikátní konstanty.

webwalker: kouknu na to.
c# Kozel zahradníkem
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: c# předání dat z DB

Příspěvek od webwalker »

No, koukni, máš to trochu zmatečný, ale z toho si nic nedělej páč teprve začínáš. Největší problém je, že voláš Form2 a pak se snažíš skrýt Form1, což je hlavní okno aplikace (kdybys ho dokonce zavřel, aplikace by byla ukončena) a v žádném případě bys ho neměl skrývat. Navíc, uzavíráš konektivitu k databázi až po volání modálního okna Form2, takže konektivita nebude nikdy uzavžena.

Každá aplikace by měla mít nějaké to uživatelsky známé rozhraní. Máš na výběr buďto MDI (multiple document interface jako třeba Word), nebo SDI (single document interface jako třeba GPU-Z ). Ty se musíš rozhodnout, jaké rozhraní by pro tebe bylo lepší. Zatím však můžeš experimentovat třeba takto.

Form1 - Hlavní okno aplikace, bude vždy vidět a jeho zavření bude znamenat konec aplikace.
Přidej si do něj buďto ToolBar s tlačítkama, nebo jednoduchá tlačítka. Jedno z nich se bude jmenovat "Login".

V události Click tlačítka Login si pak zavoláš okno frmLogin, které bude obsahovat tvůj TextBox txt_Username a tlačítko Login.
Tady se malinko zastavím, vždy je lepší a pro tvoji aplikaci přehlednější správně pojmenovávat kontroly. Lepší název pro tvůj TextBox se jménem by byl userNameTextBox, protože vždy budeš vědět, že se jedná o TextBox a to konkrétně se jménem.

Až se uživatel zaloguje a okno login se ukončí, běh programu se vrátí zpět do události Click tlačítka Login na Form1. Ty následně vyhodnotíš zalogování uživatele, převezmeš data a podle toho otevřeš další okno s kalkulacemi, kam přeneseš data (pomocí konstruktoru, vlastností nebo metody). No a nebo použiješ globální proměnné, jak jsem psal minule a nikam nic přenášet nemusíš.

Vše je transparentní a nemůže vzniknou žádný problém.

Vlastností (properties) se neboj, jsou to tvoji pomocníci a někdy i jediní :-D
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
Odpovědět

Zpět na „Programování a web“