如何通过 MySql 传递带有撇号的 C# 变量
Posted
技术标签:
【中文标题】如何通过 MySql 传递带有撇号的 C# 变量【英文标题】:How to pass a C# variable with apostrophe through MySql 【发布时间】:2014-10-21 21:03:15 【问题描述】:我在将变量输入数据库时遇到问题。我已经看过其他关于如何通过转义变量来传递变量的帖子,但是这些解决方案并不适用,因为我是通过 API 获取变量的。顺便说一句,我正在使用 foreach 循环遍历数据。
level = "" + x.Account_Level + "";
name = "" + x.name + "";
command.CommandText = "INSERT INTO `data` (`level`, `name`) VALUES(" + level + ", " + name + ")";
command.ExecuteNonQuery();
有时,一个变量会带有一个撇号,并会搞砸代码。是否可以在每个撇号之前插入一个斜杠,或者有没有像 php 那样用单引号推动整个变量的方法?谢谢!
编辑: 这行得通吗?我想我需要添加 i 来更改每个循环的参数名称,因为它声称参数已经声明。
using (var web = new WebClient())
web.Encoding = System.Text.Encoding.UTF8;
var jsonString = responseFromServer;
var jss = new javascriptSerializer();
var MatchesList = jss.Deserialize<List<Matches>>(jsonString);
string connectString = "Server=myServer;Database=myDB;Uid=myUser;Pwd=myPass;";
mysqlConnection connect = new MySqlConnection(connectString);
MySqlCommand command = connect.CreateCommand();
int i = 1;
connect.Open();
foreach (Matches x in MatchesList)
command.CommandText = "INSERT INTO `data` (`level`, `name`) VALUES(?level" + i + ", ?name" + i + ")";
command.Parameters.AddWithValue("level" + i, x.Account_Level);
command.Parameters.AddWithValue("mode" + i, x.name);
command.ExecuteNonQuery();
i++;
connect.Close();
【问题讨论】:
你真的应该使用 SQL 参数,你的代码很容易受到 SQL 注入攻击。作为一个很好的副作用,你也可以通过这种方式摆脱你的问题。 看 ip "c# mysql 参数" 【参考方案1】:快速而肮脏的解决方法是使用类似的东西:
level = level.Replace("'","whatever");
但仍然存在问题。它不会捕捉到其他坏字符,甚至可能不适用于撇号上的边缘情况。
最好的解决方案是不要以这种方式构造查询。相反,学习如何使用参数化查询,这样 SQL 注入攻击就不会发生,而且无论您在其中输入什么参数(当然是在合理范围内),参数都可以正常工作。
例如(在我的脑海中,所以可能需要一些调试):
MySqlCommand cmd = new MySqlCommand(
"insert into data (level, name) values (?lvl, ?nm)", con);
cmd.Parameters.Add(new MySqlParameter("lvl", level));
cmd.Parameters.Add(new MySqlParameter("nm", name));
cmd.ExecuteNonQuery();
【讨论】:
我之前尝试过制作参数,但它只是在 foreach 循环中搞砸了。它只是返回我之前已经声明过类似'@level'的东西。是否可以在参数名称中的 var i 中使用计数并在每个循环中使用 i++? @Kragalon,是的,你可以这样做。我自己不会:-) 是安全问题还是效率低下? 这似乎是我唯一的选择。由于我需要设置参数,而之前它会出现故障。 @Kragalon,按照您的方式构建查询是一个安全问题,因为它会使您面临 SQL 注入攻击。有一些方法可以让您的 DBMS 执行任意指令。参数化查询解决了这个问题。以上是关于如何通过 MySql 传递带有撇号的 C# 变量的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 到 Mysql 的迁移(使用 Mysql Workbench)。如何在 Workbench 向导的步骤中添加带有手动转义撇号的数据?
通过 PhpMyAdmin 将带撇号的 SQL 数据库导入 MySQL
在 PHP 中,如何创建包含引号和撇号的 mySQL 选择查询?