Подтвердить что ты не робот

С# с параметрами MySQL INSERT

Хороший день для всех, я использую Visual С# 2010 и MySQL версии 5.1.48-сообщества. Надеюсь, вы сможете помочь мне с этим кодом. Я не считаю, что это работает на меня. Что мне не хватает?

string connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
MySqlConnection conn = new MySqlConnection(connString);
conn.Open();
MySqlCommand comm = conn.CreateCommand();
comm.CommandText = "INSERT INTO room(person,address) VALUES(@person, @address)";
comm.Parameters.Add("@person", "Myname");
comm.Parameters.Add("@address", "Myaddress");
comm.ExecuteNonQuery();
conn.Close();

И когда я пытаюсь его скомпилировать. В нем говорится:

Столбец Person не может быть null

Редакция:

Но когда я пробую этот код.

comm.CommandText = "INSERT INTO room(person,address) VALUES('Myname', 'Myaddress')";

Но этот код подвержен атаке sql injection, но он работает, не дает мне ошибку.

Редакция:

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

Индекс (основанный на нуле) должен быть больше или равен нулю и меньше, чем размер списка аргументов.

Любая идея?

    string a = "myname";
    MySqlCommand cmd = new MySqlCommand();
    cmd.Connection = conn;
    cmd.CommandText = "INSERT INTO room(person,address) VALUES(?,?)";
    //cmd.Prepare();

    cmd.Parameters.Add("person", MySqlDbType.VarChar).Value = a;
    cmd.Parameters.Add("address", MySqlDbType.VarChar).Value = "myaddress";
    cmd.ExecuteNonQuery(); // HERE I GOT AN EXCEPTION IN THIS LINE

Любая помощь будет высоко оценена.

Редакция: решаемые Я использовал этот код:

cmd.CommandText = "INSERT INTO room(person,address) VALUES(?person,?address)";
cmd.Parameters.Add("?person", MySqlDbType.VarChar).Value = "myname";
cmd.Parameters.Add("?address", MySqlDbType.VarChar).Value = "myaddress";
cmd.ExecuteNonQuery();

Спасибо, SO!

4b9b3361

Ответ 1

Вы можете использовать метод AddWithValue, например:

string connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
MySqlConnection conn = new MySqlConnection(connString);
conn.Open();
MySqlCommand comm = conn.CreateCommand();
comm.CommandText = "INSERT INTO room(person,address) VALUES(@person, @address)";
comm.Parameters.AddWithValue("@person", "Myname");
comm.Parameters.AddWithValue("@address", "Myaddress");
comm.ExecuteNonQuery();
conn.Close();

ИЛИ

Попробуйте с ? вместо @, например:

string connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
MySqlConnection conn = new MySqlConnection(connString);
conn.Open();
MySqlCommand comm = conn.CreateCommand();
comm.CommandText = "INSERT INTO room(person,address) VALUES(?person, ?address)";
comm.Parameters.Add("?person", "Myname");
comm.Parameters.Add("?address", "Myaddress");
comm.ExecuteNonQuery();
conn.Close();

Надеюсь, что это поможет...

Ответ 2

Используйте метод AddWithValue:

comm.Parameters.AddWithValue("@person", "Myname");
comm.Parameters.AddWithValue("@address", "Myaddress");

Ответ 3

У меня была такая же проблема - наконец попробовал? sigil вместо @, и это сработало.

Согласно документам:

Примечание. В предыдущих версиях провайдера использовался символ "@" для отметки параметров в SQL. Это несовместимо с переменными пользователя MySQL, поэтому поставщик теперь использует '?' символ для нахождения параметров в SQL. Чтобы поддерживать старый код, вы можете установить "старый синтаксис = да" в строке подключения. Если вы это сделаете, помните, что исключение не будет выбрано, если вы не сможете определить параметр, который вы собираетесь использовать в своем SQL.

Действительно? Почему бы вам просто не выбросить исключение, если кто-то пытается использовать так называемый старый синтаксис? Через несколько часов после слива для 20-ти линейной программы...

MySQL:: MySQLCommand

Ответ 4

Три вещи: используйте оператор using, используйте AddWithValue и префиксные параметры с помощью? и добавьте Allow User Variables=True в строку подключения.

 string connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
 using (var conn = new MySqlConnection(connString))
 {
      conn.Open();
      var comm = conn.CreateCommand();
      comm.CommandText = "INSERT INTO room(person,address) VALUES(@person, @address)";
      comm.Parameters.AddWithValue("?person", "Myname");
      comm.Parameters.AddWithValue("?address", "Myaddress");
      comm.ExecuteNonQuery();
  }

Также см. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx для получения дополнительной информации об использовании команды и http://dev.mysql.com/doc/refman/5.1/en/connector-net-connection-options.html для информации о параметре Разрешить пользовательские переменные (поддерживается только в версии 5.2.2 и выше).

Ответ 5

У меня была очень похожая проблема при попытке вставить данные с помощью mysql-connector-net-5.1.7-noinstall и Visual Studio (2015) в приложение Windows Form. Я не гуру С#. Таким образом, для решения всего этого требуется около 2 часов.

В последнее время работает следующий код:

string connetionString = null;
connetionString = "server=localhost;database=device_db;uid=root;pwd=123;";

using (MySqlConnection cn = new MySqlConnection(connetionString))
{
    try
    {
        string query = "INSERT INTO test_table(user_id, user_name) VALUES (?user_id,?user_name);";
        cn.Open();
        using (MySqlCommand cmd = new MySqlCommand(query, cn))
        {
            cmd.Parameters.Add("?user_id", MySqlDbType.Int32).Value = 123;
            cmd.Parameters.Add("?user_name", MySqlDbType.VarChar).Value = "Test username";
            cmd.ExecuteNonQuery();
        }
    }
    catch (MySqlException ex)
    {
        MessageBox.Show("Error in adding mysql row. Error: "+ex.Message);
    }
}

Ответ 6

comm.Parameters.Add("person", "Myname");

Ответ 7

Попробуйте настроить код в "SqlDbType", чтобы в случае необходимости использовать ваш тип DB и использовать этот код:

comm.Parameters.Add("@person",SqlDbType.VarChar).Value=MyName;

или

comm.Parameters.AddWithValue("@person", Myname);

Это должно работать, но помните, что с Command.Parameters.Add() вы можете определить конкретный SqlDbType и с помощью Command.Parameters.AddWithValue(), он попытается получить SqlDbType на основе значения параметра неявно, что может иногда нарушаться, если оно не может неявно преобразовать тип данных.

Надеюсь, что это поможет.

Ответ 8

попробуйте это, он работает

 MySqlCommand dbcmd = _conn.CreateCommand();
    dbcmd.CommandText = sqlCommandString;
    dbcmd.ExecuteNonQuery();
    long imageId = dbcmd.LastInsertedId;