23

我正在 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)"'

该警告适用于每个参数。添加

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

所以我的问题是,我做错了什么,sql注入保存查询的新方法是什么?

4

6 回答 6

30

尝试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)";
于 2012-11-27T09:27:51.237 回答
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

于 2018-08-07T06:31:54.597 回答
1

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

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

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

和 Add( 到 AddWithValue(

于 2017-08-01T05:48:39.040 回答
0

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

所以你的参数应该是@mc_userName

于 2013-05-17T21:44:32.923 回答
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()
于 2013-06-05T20:55:51.903 回答
0

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

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

设置的正确方法MySqlDBType

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

现在设置值

于 2022-01-19T09:55:48.203 回答