0

我很欣赏这个问题之前会被问到,但是,我在过去的 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 时,参数已按应有的方式添加到命令中。

任何帮助将不胜感激,因为我非常难过!

4

1 回答 1

1

你很接近,但你必须将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 语句

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;
           }
       }
  }
于 2017-09-08T21:55:52.503 回答