我很感激之前会问过这个问题,但是,我花了最近5天的时间搜索SO和网络,还没有找到解决问题的方法。
我正在尝试使用C#从MySQL数据库中检索记录。
代码编译正常,但是当我测试应用程序并尝试将数据绑定到DataTable()时,MySqlDataReader会抛出以下异常
“阅读器关闭时读取的尝试无效”
我无法诊断出这个问题;据我所见,在我尝试阅读之前,读者并没有被关闭。
方法如下:
/// <summary>
/// Performs a select statement
/// </summary>
/// <param name="query">String of the SQL Query</param>
/// <param name="parameters">List of SQL Parameters</param>
/// <returns>DataTable</returns>
public DataTable SelectQuery(string query, List<MySqlParameter> parameters)
{
MySqlConnection connection = new MySqlConnection(connectionString);
MySqlCommand cmd = new MySqlCommand(query, connection);
foreach(MySqlParameter p in parameters)
{
cmd.Parameters.Add(p);
}
connection.Open();
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
return dt;
}
实际的数据库连接工作正常,我已经在MySqlConnection上放置了一个监视,并且连接正在打开。
我将以下查询传递给此方法:
string query = "SELECT IDS_USER, USRNM, PSSWRD, USR_SALT FROM factUser WHERE USRNM = ?username";
我在MySql Workbench中测试了它并返回了正确的数据。
当我观看MySqlCommand时,参数已经添加到命令中。
任何帮助都会非常感激,因为我绝对难过!
答案 0 :(得分:0)
您已关闭,但必须将ExecuteReader()
功能设置为MySqlDataReader
。此外,您应该养成使用using
语句的习惯,特别是在SQL相关事务中,就好像您没有正确处理您的连接一样,您将很快耗尽。使用using
语句会自动处理using
语句中的项目。
您的代码包含相应的变量
MySqlConnection connection = new MySqlConnection(connectionString);
MySqlCommand cmd = new MySqlCommand(query, connection);
foreach(MySqlParameter p in parameters)
{
cmd.Parameters.Add(p);
}
connection.Open();
DataTable dt = new DataTable();
MySqlDataReader reader = cmd.ExecuteReader();
dt.Load(reader);
return dt;
使用适当的使用声明
using(MySqlConnection connection = new MySqlConnection(connectionString)){
using(MySqlCommand cmd = new MySqlCommand(query, connection)){
foreach(MySqlParameter p in parameters)
{
cmd.Parameters.Add(p);
}
connection.Open();
DataTable dt = new DataTable();
using(MySqlDataReader reader = cmd.ExecuteReader()){
dt.Load(reader);
return dt;
}
}
}