Mysql
 sql >> Base de données >  >> RDS >> Mysql

Erreur de connexion MySQL que je n'ai jamais vue

Pourquoi utilisez-vous toujours l'ODBC bogué pour vous connecter à MySql alors qu'il existe un connecteur ADO.NET ? Quelle est également cette horrible concaténation de chaînes lors de la formation de votre requête ? :

OdbcCommand cmd = new OdbcCommand("INSERT INTO User (Email, FirstName, SecondName, DOB, Location, Aboutme, username, password) VALUES ('" + TextBox1.Text + "', '" + TextBox2.Text + "', '" + TextBox3.Text + "', '" + TextBox4.Text + "', '" + TextBox5.Text + "', '" + TextBox6.Text + "', '" + TextBox7.Text + "', '" + TextBox8.Text + "')", connection);

N'avez-vous pas entendu parler de l'injection SQL et requêtes paramétrées qui permettent de l'éviter ?

Tout ce que je peux dire, c'est que si vous utilisez le + signer lors de l'écriture d'une requête SQL, c'est comme prendre une arme à feu et tirer directement sur votre pied (ou sur la tête selon le scénario, mais dans tous les cas, vous vous tirez dessus, en gros un comportement suicidaire).

Alors, voici la bonne façon de procéder :

using (var conn = new MySqlConnection("Server=localhost; Database=gymwebsite2; User=root; Password=commando;"))
{
    conn.Open();
    using (var tx = conn.BeginTransaction())
    {
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = "INSERT INTO User (Email, FirstName, SecondName, DOB, Location, Aboutme, username, password) VALUES (@Email, @FirstName, @SecondName, @DOB, @Location, @Aboutme, @username, @password)";
            cmd.Parameters.AddWithValue("@Email", TextBox1.Text);
            cmd.Parameters.AddWithValue("@FirstName", TextBox2.Text);
            cmd.Parameters.AddWithValue("@SecondName", TextBox3.Text);

            // TODO: might require a parsing if the column is of type date in SQL
            cmd.Parameters.AddWithValue("@DOB", TextBox4.Text);

            cmd.Parameters.AddWithValue("@Location", TextBox5.Text);
            cmd.Parameters.AddWithValue("@Aboutme", TextBox6.Text);
            cmd.Parameters.AddWithValue("@username", TextBox7.Text);
            cmd.Parameters.AddWithValue("@password", TextBox8.Text);
            cmd.ExecuteNonQuery();
        }

        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = "select last_insert_id();";
            int id = Convert.ToInt32(cmd.ExecuteScalar());
            Label10.Text = Convert.ToString(id);
        }

        tx.Commit();
    }
}

Veuillez également nommer ces zones de texte de manière appropriée. Le pauvre gars qui maintiendra ce code pourrait émettre des cris de désespoir.