2014-08-28 32 views
-2

我在将数据输入到数据库时遇到问题。我看过其他文章,关于如何通过转义来传递变量,但这些解决方案不适用,因为我通过API获取变量。顺便提一下,我使用foreach循环来循环数据。如何通过MySql传递带撇号的C#变量

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

你真的应该使用SQL参数,你的代码是SQL注入攻击敞开的。作为一个很好的副作用,你也可以这样摆脱你的问题。 – Dirk 2014-08-28 05:34:19

+0

看看ip“c#mysql参数” – 2014-08-28 05:36:35

回答

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

我试过参数之前,它只是搞砸了foreach循环。它只是返回,我已经宣布过像'@level'之前。是否有可能在参数名称中使用var i中的计数并在每个循环中使用i ++? – Kragalon 2014-08-28 05:51:08

+0

@Kragalon,是的,你可以做到这一点。我不会自己:-) – paxdiablo 2014-08-28 05:57:01

+0

这是一个安全问题还是只是效率低下? – Kragalon 2014-08-28 06:00:27