2012-10-09 54 views
2

我陷入了一個問題,並沒有一個單一的想法WTF正在發生。我有一個C#Web應用程序需要使用Web服務與MySQL數據庫通信。我可以使用的方法來插入數據,但每當我嘗試閱讀任何東西(的ExecuteReader或的ExecuteScalar)失敗這個很奇怪的消息:ASP .Net - MySql - 無法讀取任何數據

給定的關鍵是不存在的字典。

現在,Web服務使用這個類與數據庫進行通信:

public class DatabaseHelper 
{ 
    private MySqlCommand cmd; 
    private MySqlConnection con; 
    public DatabaseHelper() 
    { 
     String server = "localhost"; 
     String database = "testdb"; 
     String password = "password"; 
     String username = "root"; 


     String connString = "Server = " + server + "; Database = " + database + "; Uid = " + username + "; Pwd = " + password + "; default command timeout=60;"; 
     con = new MySqlConnection(); 
     con.ConnectionString = connString; 

     cmd = new MySqlCommand(); 

     cmd.Connection = con; 
    } 

    public void RunExecuteNonQuery(string sql, MySqlParameter[] param) 
    { 
     try 
     { 

      cmd.CommandText = sql; 
      if (param != null) 
      { 
       cmd.Parameters.AddRange(param); 
      } 
      cmd.CommandText = sql; 
      con.Open(); 
      cmd.ExecuteNonQuery(); 
      con.Close(); 
      cmd.Parameters.Clear(); 

     } 
     catch (MySqlException ex) 
     { 
      con.Close(); 

     } 
    } 
    public object RunExecuteScalar(string sql, MySqlParameter[] param) 
    { 
     if (param != null) 
     { 
      cmd.Parameters.AddRange(param); 
     } 
     cmd.CommandText = sql; 
     object ret; 
     con.Open(); 
     ret = cmd.ExecuteScalar(); 
     con.Close(); 
     cmd.Parameters.Clear(); 
     return ret; 
    } 

    public MySqlDataReader RunExecuteDataReader(string sql, MySqlParameter[] param) 
    { 
     if (param != null) 
     { 
      cmd.Parameters.AddRange(param); 
     } 
     cmd.CommandText = sql; 
     MySqlDataReader ret = null; 

     con.Open(); 

     ret = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection); 
     cmd.Parameters.Clear(); 


     return ret; 
    } 
} 

它未能對cmd.ExecuteReader或cmd.ExecuteScalar!

在另一方面,從Web服務的方法看起來如下:

[WebMethod] 
    public string[] GetCategories() 
    { 
     String sql = "SELECT * FROM category"; 
     DatabaseHelper dh = new DatabaseHelper(); 
     MySqlDataReader dr = dh.RunExecuteDataReader(sql, null); 
     List<String> categories = new List<string>(); 
     while (dr.Read()) 
     { 
      categories.Add(dr[0].ToString()); 
     } 
     dr.Close(); 

     return categories.ToArray(); 
    } 

這是很奇怪的,因爲錯誤是非常神祕的(我不使用一本字典的話),我已經使用在許多其他應用程序中也是這個類。我在另一臺計算機上嘗試了相同的解決方案,結果相同。我甚至已經嘗試不同版本的MySql.Data.dll

錯誤堆棧:

System.Collections.Generic.KeyNotFoundException是由用戶代碼的HResult = -2146232969消息未處理=給定的關鍵是而不是 目前在字典中。 Source = mscorlib StackTrace: at System.Collections.Generic.Dictionary`2.get_Item(TKey key) at MySql.Data.MySqlClient.CharSetMap.GetChararcterSet(DBVersion version,String CharSetName) at MySql.Data.MySqlClient.NativeDriver。 GetFieldMetaData41() 在MySql.Data.MySqlClient.NativeDriver.GetFieldMetaData() 在MySql.Data.MySqlClient.NativeDriver.ReadColumnMetadata(的Int32計數) 在MySql.Data.MySqlClient.MySqlDataReader.NextResult() 在MySql.Data。在C:\ Users \ Visar \ Documents \ Visual Studio中的Panopticon.DataLayer.DatabaseHelper.RunExecuteDataReader(String sql, MySqlParameter []參數)中MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行爲) 2010 \ Projects \ TestApp \ TestApp \ DataLayer \ DatabaseHelper.cs:line 84 at C:\ Users \ Visar \ Documents \ Visual Studio中的Panopticon._Default.Page_Load(Object sender,EventArgs e) 2010 \ Projects \ TestApp \ TestApp \ Default.aspx.cs:line 16 at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) at System.Web.Cn.System.Web.UI.Control.OnLoad(EventArgs e) 。 System.Web.UI.Page上的UI.Control.LoadRecursive() 。ProcessRequestMain(布爾includeStagesBeforeAsyncPoint,布爾includeStagesAfterAsyncPoint)
的InnerException:

+0

將重構你的幫手,以及從config文件讀取,並從硬編碼值遠.. – MethodMan

+0

你能發佈錯誤堆棧PLZ – Marc

+0

我當然從web.config中讀取認爲有問題:( – user10901

回答

1

與此代碼替換 - 你可以刪除AddRange方法

cmd.Parameters.Add(param); 

而添加的foreach治療

foreach (var p in param) 
     { 
      cmd.Parameters.Add(p); 
     } 

最佳實踐正如DJ KRAZE所提到的那樣,將使用AddWithValue method

鏈接:http://msdn.microsoft.com/fr-fr/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx

+0

或cmd.Parameters.AddWithValues(param).Add方法已被btw – MethodMan

+0

刪除yes我知道但第一次是找到問題,第二次用AddWithValue回答,謝謝DJ KRAZE的評論,我將你的答案添加到我的回答 –

+0

不是問題Aghilas你的回答足夠好+1我給你我另一個問題,我注意到他是將Params作爲一個數組傳遞..如果其中一個參數沒有填充或者爲空,也可能導致他潛在的問題,但是你的解決方案應該足以讓他去 – MethodMan