【问题标题】:MySqlDataReader object not receiving any data from functionMySqlDataReader 对象未从函数接收任何数据
【发布时间】:2021-04-04 04:51:32
【问题描述】:

我有一个 post action 方法,它从表单中获取用户名和密码。在这个动作方法中,我使用一个函数来对数据库执行 mysql 命令

这是从数据库中读取的函数

public static MySqlDataReader GetDataFromDB(string command)
{
    using (MySqlConnection con = new MySqlConnection(ConStr))
    {

        com = new MySqlCommand(command, con);

        con.Open();

        MySqlDataReader rdr1 = com.ExecuteReader();

        while (rdr1.Read())
        {
                    
        }

        return rdr1;
    }
}

这就是我尝试在我的操作方法中使用此功能的方式

MySqlDataReader rdr2 = Helper.GetDataFromDB("select * from library.Accounts where username = '" + username + "' and password = '" + password + "'");

我在辅助方法中设置了一个断点,并且可以看到它正在从数据库中读取数据,并将所有预期的行数据存储在内部的“rdr1”对象中,但是它没有在最后返回任何内容作为“rdr2”对象完成后为空。我不知道是不是出了什么问题,或者我只是个白痴,所以如果有人能告诉我哪里出错了,我会很感激。

【问题讨论】:

  • 数据读取器是一个只向前的数据读取类。一旦你读完了,就没有更多的东西要读了,你不能再回到开始了。如果要取回数据,则应使用 dataTableInstance.Load(cmd.ExecuteReader()) 填充 DataTable 并返回 DataTable
  • 还要考虑,即使您不启动读取循环,也无法将 rdr1 还给调用者,因为您的代码从 using 语句中退出,并且连接将在此时关闭。因此,datareader 无法再从数据库中读取任何内容

标签: c# mysql asp.net


【解决方案1】:

MySqlDataReader 等数据读取器是仅转发的。这意味着一旦数据被读取并移动到下一条记录或数据的末尾,它就不能回到开头。

如果你删除这段代码:

while (rdr1.Read())
{

}

您应该会发现它会在开始时返回数据读取器,因此能够读取您从数据库加载的数据。

此外,您应该知道,当 using () {...} 块完成时,连接将被关闭,同时数据读取器读取数据的能力也将关闭。

如果您确实想返回数据读取器,请将 using() {...} 块删除为一个简单的语句,例如:

MySqlConnection con = new MySqlConnection(ConStr);

如果您确实想在数据加载后向后和向前导航、过滤或排序数据,您应该从数据读取器将数据加载到DataTable

例子:

DataTable dt = new DataTable();
dt.Load(rdr1);

【讨论】:

  • 对不起,您的答案的第一部分是错误的。一旦连接关闭,阅读器就没有用了。
  • 感谢@Steve 的提醒。我添加了有关需要打开连接的阅读器的其他信息
猜你喜欢
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
相关资源
最近更新 更多