2014-08-27 73 views
0

我试图通过认为开发人员API的游戏的数据匹配并将它们存储在数据库中。我如何将x.something传递给我的数据库。当我尝试这样的事:通过MySql传递Foreach变量插入

  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(); 
       command.CommandText = "INSERT into data (level, name) values('" + x.Account_Level + "','" + x.Name + "')"; 
       string MatchesListStr = ""; 

       connect.Open(); 
       foreach (Matches x in MatchesList) 
       { 
        MatchesListStr = MatchesListStr + ", " + x.Name + ", " + x.Account_Level + ", " + x.Reference_Name + "!"; 
        command.ExecuteNonQuery(); 
       } 
       connect.Close(); 
       MessageBox.Show(MatchesListStr); 
      } 

它说:

型 'MySql.Data.MySqlClient.MySqlException' 未处理的异常发生在MySql.Data.dll

附加信息:您的SQL语法有错误;检查 对应于您的MySQL服务器版本的权利 语法使用近“字的手册,

任何帮助表示赞赏,我是新来的C#。谢谢!

编辑 - 更新的代码:

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

      connect.Open(); 
      foreach (Matches x in MatchesList) 
      { 
       command.CommandText = "INSERT into data (level, mode) values(@level, @mode)"; 
       command.Parameters.AddWithValue("@level", x.Account_Level); 
       command.Parameters.AddWithValue("@mode", x.Name); 
       command.ExecuteNonQuery(); 
      } 
      connect.Close(); 

     } 

public class Matches 
     { 
      public int Account_Level { get; set; }   
      public string Name { get; set; } 
     } 

用相同的答案之前回复。

+0

我会看看使用[准备语句](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare(v = vs.110).aspx)来使确保字符正确转义。如果你在x.Account_Level或x.Name变量中有奇怪的字符,它将导致无效的SQL。 – zerodiff 2014-08-27 21:35:34

+0

我在文档中写下了所有这些。我没有包括它,因为我认为这是一个给定的因素。 – Kragalon 2014-08-27 23:05:56

回答

1

您目前的做法容易受到SQL injection的影响。你应该通过parameterising来避免这个问题。

我希望你有问题,因为表中的level列需要输入一个整数 - 当你提供一个字符串。

我会做这样的事情进行排序您的问题:

command.CommandText = "INSERT into data (level, name) values (@level, @name)"; 
// Now let’s add the parameters themselves. 
command.Parameters.AddWithValue("@level", x.level); 
command.Parameters.AddWithValue("@name", x.name); 

注:我也假设你是提供了一个名为x参数(这是Matches型)的程序。这就是为什么命名变量时应该多加小心。

+0

我为我需要的所有值做了参数。我仍然得到同样的错误。在插入断点时,参数按预期显示正确的值,但它只是有一个问题:command.ExecuteNonQuery(); – Kragalon 2014-08-27 22:55:53

+0

另外,我的代码中x.level设置为int较低。我只是没有分享。 – Kragalon 2014-08-27 23:17:56

+0

好的 - 你更新了CommandText,如上所示? 您可以直接在服务器上执行命令吗?您应该能够在调试时看到完整的命令字符串,否则您将看到它是否在Sql Server Profiler中(当其运行并记录日志时)。 – 2014-08-27 23:28:47