MySqlCommand Command.Parameters.Add 已过时

Posted

技术标签:

【中文标题】MySqlCommand Command.Parameters.Add 已过时【英文标题】:MySqlCommand Command.Parameters.Add is obsolete 【发布时间】:2012-11-14 21:11:12 【问题描述】:

我正在 Visual Studio 2010 中制作 C# windows 窗体应用程序。

该应用程序正在连接到一个 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();

连接正常。这行得通。

我读过here,我现在的方式是一种保存查询的方式。还是这样吗?

现在是真正的问题。使用上面的代码,我在 Visual Studio 中收到以下警告:

'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注入保存查询的新方法是什么?

【问题讨论】:

按照警告中的建议使用AddWithValue @Habib,完成,警告消失了,但数据库中的值仍然不正确...] 【参考方案1】:

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

【讨论】:

参数化查询?是的。 @MarcMeesters 如果它对你有用,接受答案怎么样?【参考方案2】:

编辑: 正如 Bradley Grainger 所指出的,在 MySQL 中使用AddWithValue 是安全的。 如果您偶然来到这里并使用 Microsoft SQL,我会保留我的答案。


请阅读这篇文章,建议您不要使用AddWithValue

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

它基本上说AddWithValue 有时可能会错误地推断出正确的类型。请改用Add

【讨论】:

那篇文章是针对 SQL Server 的。对于 MySQL,没有理由避免 AddWithValue:mysqlconnector.net/overview/using-addwithvalue【参考方案3】:

只需编辑/删除这部分的一些代码

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

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

和 Add( 到 AddWithValue(

【讨论】:

【参考方案4】:

@mcUserName 必须匹配查询中的 mc_userName ..

所以你的参数应该是@mc_userName

【讨论】:

【参考方案5】:

这是 VB 代码...

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

【讨论】:

我想你会发现你应该在参数名称周围使用方括号,所以 'cmd.Parameters["@number"].Value = 321'【参考方案6】:

应该这样使用以防止任何错误正确设置dbtype然后分配

cmd.Parameters.Add("@ID", MySqlDbType.Int32); 

设置MySqlDBType的正确方法

cmd.Parameters["@ID"].Value = 1; 

现在设置值

【讨论】:

以上是关于MySqlCommand Command.Parameters.Add 已过时的主要内容,如果未能解决你的问题,请参考以下文章

使用 MySqlCommand 在一个查询中进行多个 INSERT

使用 MySqlCommand 执行存储过程时出现 SqlNullValueException

MySQL 连接器/NET 的 MySqlCommand 不使用参数

MySqlCommand Command.Parameters.Add 已过时

是否可以在 .NET MySqlCommand 中使用 MySql 用户定义变量?

在一个查询中使用 MySqlCommand 将多条记录插入 MySQL C# (MySQLConnector) & command 转义引号的参数