代码之家  ›  专栏  ›  技术社区  ›  Kragalon

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

  •  -2
  • Kragalon  · 技术社区  · 10 年前

    我在数据库中输入变量时遇到问题。我已经看到了其他关于如何通过转义来传递变量的帖子,但这些解决方案并不适用,因为我是通过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 回复  |  直到 10 年前
        1
  •  2
  •   paxdiablo    10 年前

    快速而肮脏的解决方法是使用以下内容:

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