Ошибка подключения MySQL, которую я никогда не видел - PullRequest
1 голос
/ 05 апреля 2011

Новая ошибка mysql:

ERROR [42000] [MySQL][ODBC 3.51 Driver][mysqld-5.5.9]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'System.Data.Odbc.OdbcCommand' at line 1 

Я никогда раньше не видел эту ошибку и не знаю, с чем это связано?

    using (var conn = new OdbcConnection("Driver={MySQL ODBC 3.51 Driver}; Server=localhost; Database=gymwebsite2; User=root; Password=fakepass;"))
    {
        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();
//error on this line
            }

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

            tx.Commit();
        }
    }

{"ExecuteNonQuery требует, чтобы команда имела транзакцию, когда назначенное команде соединение находится в ожидающей локальной транзакции. Свойство Transaction команды не было инициализировано."}

1 Ответ

8 голосов
/ 05 апреля 2011

Почему вы все еще используете глючный ODBC для подключения к 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();
    }
}

Также, пожалуйста, назовите эти текстовые поля соответственно. Бедный парень, который будет поддерживать этот код, может издавать крики отчаяния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...