2

我遇到了一个问题,不知道 WTF 正在发生。我有一个需要使用 Web 服务与 MySQL 数据库通信的 C# Web 应用程序。我可以使用方法来插入数据,但是每当我尝试读取任何内容(ExecuteReader 或 ExecuteScalar)时,它都会失败并显示以下非常奇怪的消息:

字典中不存在给定的键。

现在,Web 服务使用此类与 db 进行通信:

 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:在 System.Collections.Generic.Dictionary`2.get_Item(TKey key) 在 MySql.Data.MySqlClient.CharSetMap.GetChararcterSet(DBVersion version, String CharSetName) 在 MySql.Data.MySqlClient.NativeDriver.GetFieldMetaData41()在 MySql.Data.MySqlClient.NativeDriver.GetFieldMetaData() 在 MySql.Data.MySqlClient.NativeDriver.ReadColumnMetadata(Int32 计数) 在 MySql.Data.MySqlClient.MySqlDataReader.NextResult() 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior行为)在 Panopticon.DataLayer.DatabaseHelper.RunExecuteDataReader(字符串 sql,
内部异常:

4

1 回答 1

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

于 2012-10-09T19:10:16.080 回答