MySqlDataReader - 读取器关闭时读取的尝试无效

时间:2017-09-08 21:41:05

标签: c# mysql asp.net mysqldatareader

我很感激之前会问过这个问题,但是,我花了最近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时,参数已经添加到命令中。

任何帮助都会非常感激,因为我绝对难过!

1 个答案:

答案 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;
           }
       }
  }