sql >> データベース >  >> RDS >> Mysql

私が見たことがないMySQL接続エラー

    ADO.NETコネクタ ?また、クエリを作成するときのこの恐ろしい文字列の連結は何ですか?:

    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);
    

    SQLインジェクション について聞いたことがありませんか およびパラメータ化されたクエリ どちらがそれを回避することができますか?

    私が言えるのは、+を使用する場合 SQLクエリを作成するときに署名するのは、銃を持って足元で射撃するようなものです(シナリオによっては頭を撃ちますが、すべての場合で、基本的に自殺行為です)。

    だから、これが物事を行うための適切な方法です:

    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();
        }
    }
    

    また、それらのテキストボックスに適切な名前を付けてください。このコードを維持しようとしている貧しい人は、絶望の悲鳴を上げるかもしれません。




    1. SQLiteエラーに複数の行を挿入します(エラーコード=1)

    2. 高度なMySqlクエリ:別のテーブルからの情報でテーブルを更新します

    3. Oracleストアドプロシージャの例のテーブルタイプ

    4. PHPクエリビルダーを使用した複雑なWHERE句の処理