我遇到了一个问题,不知道 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,
内部异常: