我正在Visual Studio 2010中制作一个C#窗口表单应用程序。
该应用程序正在连接到 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)"'
该警告适用于每个参数。
它甚至不起作用,因为插入的值是@mcUserName、@mcUserPass等,而不是变量 mcUserNameNew 等保存的值......
所以我的问题是,我做错了什么,sql 注入保存查询的新方法是什么?
尝试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)";
编辑:正如Bradley Grainger指出的那样,在MySQL中使用AddWithValue
是安全的。如果您偶然来到这里并使用Microsoft SQL,我会保留我的答案。
请阅读本文,建议您不要使用AddWithValue
:
https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/
它基本上说AddWithValue
有时会错误地推断出正确的类型。请改用Add
。
只需编辑/删除此部分中的一些代码
('@mcUserName', '@mcUserPass', '@twUserName', '@twUserPass')
自
(@mcUserName, @mcUserPass, @twUserName, @twUserPass)
和 Add( 到 AddWithValue(
@mcUserName必须匹配查询中的mc_userName。
所以你的参数应该是@mc_userName
这是 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.Add("@ID", MySqlDbType.Int32);
设置MySqlDBType
的正确方法
cmd.Parameters["@ID"].Value = 1;
现在设置值