MySqlCommand Command.Parameters.Add устарел

Я делаю приложение формы Windows С# в Visual Studio 2010.

Это приложение подключается к базе данных mysql, и я хочу вставить в нее данные.

Теперь у меня есть эта часть кода:

MySqlConnection connection;
string cs = @"server=server ip;userid=username;password=userpass;database=databse";
connection = new MySqlConnection(cs);
connection.Open();

MySqlCommand command = new MySqlCommand();
string SQL = "INSERT INTO `twMCUserDB` (`mc_userName`, `mc_userPass`, `tw_userName`, `tw_userPass`) VALUES ('@mcUserName', '@mcUserPass', '@twUserName', '@twUserPass')";
command.CommandText = SQL;
command.Parameters.Add("@mcUserName", mcUserNameNew);
command.Parameters.Add("@mcUserPass", mcUserPassNew);
command.Parameters.Add("@twUserName", twUserNameNew);
command.Parameters.Add("@twUserPass", twUserPassNew);
command.Connection = connection;
command.ExecuteNonQuery();
connection.Close();

Связь в порядке. Это работает.

Я прочитал здесь, что путь что у меня есть сейчас, это способ сохранения запросов. Это все еще правильно?

А теперь собственно вопрос. С этим кодом выше я получаю следующее предупреждение в визуальной студии:

'MySql.Data.MySqlClient.MySqlParameterCollection.Add(string, object)' is obsolete: '"Add(String parameterName, Object value) has been deprecated.  Use AddWithValue(String parameterName, Object value)"'

Это предупреждение для каждого параметра. добавить

И это даже не работает, потому что вставляются значения @mcUserName, @mcUserPass и так далее, а не значения, которые содержат переменные mcUserNameNew и так далее...

Итак, мой вопрос: я делаю что-то не так, и каков новый способ сохранения SQL-инъекций, выполняющий запрос?


person Mathlight    schedule 27.11.2012    source источник
comment
используйте AddWithValue как предложено в предупреждении   -  person Habib    schedule 27.11.2012
comment
@Хабиб, готово, предупреждений больше нет, но значение в БД все равно не то...]   -  person Mathlight    schedule 27.11.2012


Ответы (5)


попробуй AddWithValue

command.Parameters.AddWithValue("@mcUserName", mcUserNameNew);
command.Parameters.AddWithValue("@mcUserPass", mcUserPassNew);
command.Parameters.AddWithValue("@twUserName", twUserNameNew);
command.Parameters.AddWithValue("@twUserPass", twUserPassNew);

и не заключайте заполнители в одинарные кавычки.

string SQL = "INSERT INTO `twMCUserDB` (`mc_userName`, `mc_userPass`, `tw_userName`, `tw_userPass`) VALUES (@mcUserName, @mcUserPass, @twUserName, @twUserPass)";
person John Woo    schedule 27.11.2012
comment
параметризовать запрос? да. - person John Woo; 27.11.2012
comment
@MarcMeesters, как насчет того, чтобы принять ответ, если он сработал для вас? - person booyaa; 27.11.2012

Редактировать: Как отметил Брэдли Грейнджер, в MySQL безопасно использовать AddWithValue. Я сохраняю свой ответ, если вы случайно попадете сюда и используете Microsoft SQL.


Прочтите эту статью, в которой рекомендуется не использовать AddWithValue:

https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/

В основном это говорит о том, что AddWithValue иногда может неправильно определить правильный тип. Вместо этого используйте Add.

person Adam Calvet Bohl    schedule 07.08.2018
comment
Эта статья предназначена для SQL Server. Нет причин избегать AddWithValue для MySQL: mysqlconnector.net/overview/using-addwithvalue - person Bradley Grainger; 09.04.2020

Просто отредактируйте/удалите код в этой части

('@mcUserName', '@mcUserPass', '@twUserName', '@twUserPass')

to

(@mcUserName, @mcUserPass, @twUserName, @twUserPass)

и Добавить( к AddWithValue(

person Ramgy Borja    schedule 01.08.2017

@mcUserName должен соответствовать mc_userName в запросе..

так что ваш параметр должен быть @mc_userName

person Chris    schedule 17.05.2013

Это код ВБ...

cmd.Parameters.AddWithValue("@number", 1) 'set @number as numeric
cmd.Parameters.AddWithValue("@text", "this will be a text variable") 

cmd.Parameters("@number").Value = 321  'now @number has a value
cmd.Parameters("@text").Value = "A string value" 'now @text has a value

cmd.ExecuteNonQuery()
person David    schedule 05.06.2013
comment
я думаю, вы обнаружите, что вам следует использовать квадратные скобки вокруг имени параметра, поэтому «cmd.Parameters[@number].Value = 321» - person Paul S Chapman; 10.05.2015