如何通过MySql传递带有撇号的C#变量

时间:2014-08-28 05:30:37

标签: c# mysql phpmyadmin apostrophe

我在将变量输入数据库时​​遇到问题。我已经看过其他关于如何通过转义传递变量的帖子,但这些解决方案不适用,因为我通过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();                    
    }

1 个答案:

答案 0 :(得分:2)

快速而肮脏的修复是使用类似的东西:

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