2014-08-27 137 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