Dodanie rekordu do bazy danych po sprawdzeniu warunku

0

Cześć zaczynam ogarniać bazy danych i zatrzymałem się chyba przy dość prostym problemie.
Otóż mam prostą bazę użytkowników i przed dodaniem użytkownika do bazy chciałbym sprawdzić czy dany login jest wolny.
Napisałem taki kod ale wyrzuca błąd że połączenie jest już w użyciu.

private void button1_Click(object sender, EventArgs e)
        {
            string connection = "datasource=127.0.0.1;port=3306;username=root;password=;database=bazatest;";
            string query = "SELECT name FROM users WHERE name='Podaneimie'";//wyszukuje w bazie podane imie
            MySqlConnection databaseConnection = new MySqlConnection(connection);
            MySqlCommand command = new MySqlCommand(query, databaseConnection);
            MySqlDataReader reader;
            try
            {
                
                databaseConnection.Open();

               reader = command.ExecuteReader();

                

                if (reader.HasRows)
                {
                    MessageBox.Show("Taki uzytkownik juz istnieje");//jesli imię istnieje to daje komunikat
                }
                else //w przeciwnym wypadku che dodać rekord:
                {
                    query = "INSERT into users ('id', 'name', 'number') VALUES (NULL, 'Podaneimie', '123');";
                    MySqlCommand command1= new MySqlCommand(query,databaseConnection);
                    command1.ExecuteReader();
                    MessageBox.Show("dodano");
                }

                // Finally close the connection
                databaseConnection.Close();
            }
            catch (Exception ex)
            {
                // Show any error message.
                MessageBox.Show(ex.Message);
            }
        }
    }

Co jest nie tak z tym kodem?

0

Proponuje skorzystać z using. Pozamyka wszystko automatycznie.

string connection = "datasource=127.0.0.1;port=3306;username=root;password=;database=bazatest;";
string query = "SELECT name FROM users WHERE name='Podaneimie'";

using (MySqlConnection con = new MySqlConnection(connection))
{
    using(MySqlCommand cmd = new MySqlCommand(query, con))
    {
        using(MySqlDataReader reader = cmd.ExecuteReader())
        {
            if (reader.HasRows)
            {
                //jesli imię istnieje to daje komunikat
            }
            else //w przeciwnym wypadku che dodać rekord:
            {
                query = "INSERT into users ('id', 'name', 'number') VALUES (NULL, 'Podaneimie', '123');";
                MySqlCommand command1 = new MySqlCommand(query, con);
                command1.ExecuteReader();
            }
        }
    }
}
0

próbujesz wykonać zapytanie command1 na nie zamkniętym polaczeniu po pierwszym zapytaniu command.

przestaw się na używanie bloków using zamiast ręcznie otwierać i zamykać polaczenia, wtedy łatwiej ci będzie zapanować nad takimi bledami.

using (MySqlConnection databaseConnection = new MySqlConnection(connection))
0

@AdamWox: Dla tego kodu wywala błąd że połączenie musi być otwarte a obecnie jest zamkniętę. Trzeba je jeszcze najpierw otworzyć? Czy using powinno samo to zrobić?

0
using (MySqlConnection databaseConnection = new MySqlConnection(connection))
    {
        using (MySqlCommand command = new MySqlCommand(query, databaseConnection))
        {
            try
            {
                databaseConnection.Open();
                (...)
0

@Varran:

 string connection = "datasource=127.0.0.1;port=3306;username=root;password=;database=bazatest;";
            string query = "SELECT name FROM users WHERE name='ghy'";

            using (MySqlConnection con = new MySqlConnection(connection))
                
            {
               
                using (MySqlCommand cmd = new MySqlCommand(query, con))
                {
                    try
                    {
                        con.Open();
                        using (MySqlDataReader reader = cmd.ExecuteReader())
                        {
                            if (reader.HasRows)
                            {
                                //jesli imię istnieje to daje komunikat
                            }
                            else //w przeciwnym wypadku che dodać rekord:
                            {
                                query = "INSERT into users ('id', 'name', 'number') VALUES (NULL, 'ghy', '123');";
                                MySqlCommand command1 = new MySqlCommand(query, con);
                                command1.ExecuteNonQuery();
                            }
                        }
                    } catch (Exception ex) { MessageBox.Show(ex.Message); }
                }
            }

Dałem taki kod i wyrzuca błąd tak jak u mnie na początku że połączenie jest już w użyciu...
Ogólnie poradziłem sobie tak że że robię najpierw zapytanie ze sprawdzeniem czy jest dany użytkownik i potem łącze się ponownie dodając użytkownika bez sprawdzania już. Tak jakby dwu-etapowo.

0

a sprobuj tak:

query = "INSERT into users ('id', 'name', 'number') VALUES (NULL, 'Podaneimie', '123');";
                        command.CommandText = query;
                        command.ExecuteNonQuery();
                        ```
1

A w ten sposób zadziała?

string connection = "datasource=127.0.0.1;port=3306;username=root;password=;database=bazatest;";
string query = "SELECT name FROM users WHERE name='Podaneimie'";

bool loginExists = false;

using (MySqlConnection con = new MySqlConnection(connection))
{
    con.Open();
    
    using(MySqlCommand cmd = new MySqlCommand(query, con))
    {
        using(MySqlDataReader reader = cmd.ExecuteReader())
        {
            loginExists = reader.HasRows;
        }
    }

    if (!loginExists)
    {
        query = "INSERT into users ('id', 'name', 'number') VALUES (NULL, 'Podaneimie', '123');";

        using (MySqlCommand cmd2 = new MySqlCommand(query, con))
        {
            cmd2.ExecuteNonQuery();
        }
    }
}
0
specjal1990 napisał(a):

(...) że zostanę przy niewydajnym dwu-etapowym podejściu do chyba prostego tematu..

można (a nawet lepiej) wszystko przenieść do zapytania sql, wtedy wyglądać to może tak:

string query = "INSERT INTO users (name, number) SELECT 'Podaneimie2', '123' WHERE NOT EXISTS (SELECT 1 FROM users WHERE name = 'Podaneimie2')";

using (SqlConnection con = new SqlConnection(connection))
{
    con.Open();

    using (SqlCommand cmd = new SqlCommand(query, con))
    {
        cmd.ExecuteNonQuery();
    }
}

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