MySqlCommand Command.Parameters.Add已过时。

24

我正在使用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();

连接正常,是可行的。

我在这里读到,现在我使用的方式是一个安全的进行查询的方式。这仍然正确吗?

现在来谈谈真正的问题。使用上述代码,在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)"'

这个警告适用于每个parameters.add。

而且它甚至没有起作用,因为插入的值是@mcUserName、@mcUserPass等,而不是变量mcUserNameNew等所持有的值...

所以我的问题是,我做错了什么,新方法如何实现防止SQL注入并执行查询?


3
请使用警告中建议的 AddWithValue - Habib
@Habib,已完成,警告已消失,但数据库中仍未出现正确的值... - Mathlight
6个回答

32

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

要对查询进行参数化吗?是的。 - John Woo
@MarcMeesters 如果这个答案对您有用,不妨考虑接受它呢? - booyaa

2

1
那篇文章是关于SQL Server的。在MySQL中没有理由避免使用AddWithValue:https://mysqlconnector.net/overview/using-addwithvalue/ - Bradley Grainger

1
在这部分中只需编辑/删除一些代码。
('@mcUserName', '@mcUserPass', '@twUserName', '@twUserPass')

to

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

和 Add(转换为) AddWithValue(


0

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

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

设置 MySqlDBType 的正确方法

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

现在设置数值


0

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

因此,您的参数应为@mc_userName


0

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

1
我认为你会发现应该在参数名称周围使用方括号,因此 'cmd.Parameters["@number"].Value = 321'。 - Paul S Chapman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接