С# с параметрами 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!
Ответы
Ответ 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;