MySQL i dodawanie własnych rekordów

0

Witajcie
Uczę się C# i przyszedł czas na próbę zrozumienia operacji na MySQL
Mam taki kodzik:

private void button1_Click(object sender, EventArgs e)
        {
            pobierzDane();
        }

        public void pobierzDane()
        {
            //pobierz dane logowania z formularza i przypisz
            string mojePolaczenie =
            "SERVER=localhost;" +
            "DATABASE=sc_db;" +
            "UID=root;" +
            "PASSWORD=;";

            //wykonaj polecenie języka SQL
            string sql = textBox1.Text;

            MySqlConnection polaczenie = new MySqlConnection(mojePolaczenie);
            //blok try-catch przechwytuje błędy
            try
            {
                //otwórz połączenie z bazą danych
                polaczenie.Open();
                //wykonaj polecenie języka SQL na danych połączeniu
                using (MySqlCommand cmdSel = new MySqlCommand(sql, polaczenie))
                {
                    DataTable dt = new DataTable();
                    //Pobierz dane i zapisz w strukturze DataTable
                    MySqlDataAdapter da = new MySqlDataAdapter(cmdSel);
                    da.Fill(dt);
                }

            }
            //Jeżeli wystąpi wyjątek wyrzuć go i pokaż informacje
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                MessageBox.Show("Błąd logowania do bazy danych MySQL" + ex, "Błąd");
            }
            //Zamknij połączenie po wyświetleniu danych
            polaczenie.Close();

        }

Wszystko działa jak należy jednak jeżeli chcę w czasie pracy aplikacji wykonać kolejną operację to nie mogę po prostu wstawić pod inny button string sql = ""; bo juz nie odczyta tego "sql".
Jest jakiś sposób by to zadziałało bez przepisywania całego kodu w koło?

0

Twoja zmienna sql pobiera wpis z textBox1 dlaczego po prostu nie zrobisz string sql = textBox1.Text pod drugim przyciskiem?
Druga opcja to

public void PobierzDane(string sql)
{
}
private void button1_Click(object sender, EventArgs e)
{
    pobierzDane(textBox1.Text);
}
0

Ponieważ jak kod będzie wyglądał tak:

private void button1_Click(object sender, EventArgs e)
        {
            pobierzDane();
        }

        public void pobierzDane()
        {
            //pobierz dane logowania z formularza i przypisz
            string mojePolaczenie =
            "SERVER=localhost;" +
            "DATABASE=sc_db;" +
            "UID=root;" +
            "PASSWORD=;";

            //wykonaj polecenie języka SQL
            string sql = textBox1.Text;

            MySqlConnection polaczenie = new MySqlConnection(mojePolaczenie);
            //blok try-catch przechwytuje błędy
            try
            {
                //otwórz połączenie z bazą danych
                polaczenie.Open();
                //wykonaj polecenie języka SQL na danych połączeniu
                using (MySqlCommand cmdSel = new MySqlCommand(sql, polaczenie))
                {
                    DataTable dt = new DataTable();
                    //Pobierz dane i zapisz w strukturze DataTable
                    MySqlDataAdapter da = new MySqlDataAdapter(cmdSel);
                    da.Fill(dt);
                }

            }
            //Jeżeli wystąpi wyjątek wyrzuć go i pokaż informacje
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                MessageBox.Show("Błąd logowania do bazy danych MySQL" + ex, "Błąd");
            }
            //Zamknij połączenie po wyświetleniu danych
            //polaczenie.Close();

        }

        private void button2_Click(object sender, EventArgs e)
        {
            string sql = textBox1.Text;
        }

To mimo braku błędów i poprawnej kompilacji drugi przycisk nie dodaje rekordów z textBox do bazy.

W momencie jak zmienię

public void PobierzDane()

na

public void PobierzDane(string sql)

To kompilator wyrzuca

Ważność Kod Opis Projekt Plik Wiersz Stan pominięcia
Błąd CS7036 Nie podano argumentu odpowiadającego wymaganemu parametrowi formalnemu „sql” elementu „Form1.pobierzDane(string)” SQL1 C:\Users\mcywinski\source\repos\SQL1\SQL1\Form1.cs 28 Aktywne
Ważność Kod Opis Projekt Plik Wiersz Stan pominięcia
Błąd CS0136 Element lokalny lub parametr o nazwie „sql” nie może zostać zadeklarowany w tym zakresie, ponieważ ta nazwa jest już użyta w otaczającym zakresie lokalnym do zdefiniowania elementu lokalnego lub parametru SQL1 C:\Users\mcywinski\source\repos\SQL1\SQL1\Form1.cs 41 Aktywne

1
private void button1_Click(object sender, EventArgs e)
        {
            pobierzDane(textBox1.Text);
        }

        public void pobierzDane(string sql)
        {
            //pobierz dane logowania z formularza i przypisz
            string mojePolaczenie =
            "SERVER=localhost;" +
            "DATABASE=sc_db;" +
            "UID=root;" +
            "PASSWORD=;";

            //wykonaj polecenie języka SQL
            //string sql = textBox1.Text;

            MySqlConnection polaczenie = new MySqlConnection(mojePolaczenie);
            //blok try-catch przechwytuje błędy
            try
            {
                //otwórz połączenie z bazą danych
                polaczenie.Open();
                //wykonaj polecenie języka SQL na danych połączeniu
                using (MySqlCommand cmdSel = new MySqlCommand(sql, polaczenie))
                {
                    DataTable dt = new DataTable();
                    //Pobierz dane i zapisz w strukturze DataTable
                    MySqlDataAdapter da = new MySqlDataAdapter(cmdSel);
                    da.Fill(dt);
                }

            }
            //Jeżeli wystąpi wyjątek wyrzuć go i pokaż informacje
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                MessageBox.Show("Błąd logowania do bazy danych MySQL" + ex, "Błąd");
            }
            //Zamknij połączenie po wyświetleniu danych
            //polaczenie.Close();

        }

        private void button2_Click(object sender, EventArgs e)
        {
            pobierzDane(textBox1.Text);
        }
0

Aż musiałem uruchomić diff-online.com by to zrozumieć :)
Działa, aż miło. Bardzo Ci dziękuję za nieocenioną pomoc :)

0

Tak przy okazji.
Jak sprawdzić np. buttonem czy połączenie z bazą zostało nawiązane poprawnie?
Wiem, że już ten kod sam w sobie to robi ale chciałbym już podczas działania aplikacji sprawdzić czy utrzymuje połączenie.
Powiedzmy, że po kilku minutach chciałbym kliknąć button, który otworzy form2 ale tylko jeśli połączenie z bazą jest poprawne.

EDIT.: W sumie w powyższym przypadku też będzie problem jeżeli nie wywołamy z przycisku pobierzDane(textBox1.Text); bo jeżeli dane do bazy będą nie poprawne, a tego zabraknie to nawet nie wyrzuci komunikatu o błędzie. Więc i w taki przypadku pytanie jak to ugryźć?

0

Nie utrzymywać otwartego połączenia. Wtedy nie musisz sprawdzać czy jest otwarte :)

0

No dobrze w takim razie zapytam inaczej :)
Jak sprawdzić czy dane wprowadzone są poprawne z poziomu buttona w dowolnym momencie pracy aplikacji?
Coś w stylu

if button1.click()
{
     //coś gdy połączy z bazą
} else {
     /coś jak nie może połączyć
}
0

Po clicku
Otwierasz połączenie
Zapisujesz dane
Zamykasz połączenie.
Jak nie dostaniesz wyjątku to jest ok.

Oczywiście można i powinno się to napisać lepiej ale to, jak sądzę, przed Tobą :)
Generalnie operacje na bazie powinno się wywalić z UI do innej warstwy chociaż w bardzo prostych przypadkach niekoniecznie.

0
jacek.placek napisał(a):

Oczywiście można i powinno się to napisać lepiej ale to, jak sądzę, przed Tobą :)
Generalnie operacje na bazie powinno się wywalić z UI do innej warstwy chociaż w bardzo prostych przypadkach niekoniecznie.

Dlaczego do innej warstwy? Mógłbyś podesłać jakiś poradnik który wyjaśni jak poprawnie to implementować?

2

Dlaczego... Hm... Nawet nie wiem jak to krótko opisać. Bo tak :) Powodów jest dużo.
Konkretnego poradnika Ci nie podam bo nie znam jakiegoś konkretnego. W necie są tysiące stron i wpisów o tym. MSDN, YouTube, Pluralsight itp.
Możesz poszukać o wzorcu Repozytorium albo o aplikacjach dwu (i więcej) warstwowych. Generalnie w UI powinna być logika dotycząca UI.

0

Ok, dzięki ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1