gpt4 book ai didi

c# - DataReader 已经打开

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:59 26 4
gpt4 key购买 nike

我遇到了一个错误,提示我的数据读取器已经打开。

我的代码是这样的

public static Users GetByID(int ID, SqlConnection connection)
{
SqlCommand command = new SqlCommand("Select Name, Email, LastLogin, FK_Role_ID from Users where ID=@id");
command.Connection = connection;

command.Parameters.Add(new SqlParameter("id", ID));

SqlDataReader reader = command.ExecuteReader();
if (reader.Read())
{
Users user = new Users();
user.ID = ID;
user.Name = reader.GetString(0);
user.Email = reader.GetString(1);
user.LastLogin = reader.GetString(2);
user.role = Role.GetRoleByID(reader.GetInt32(3), connection);
reader.Close();
return user;
}
else
{
reader.Close();
return null;
}
}

错误发生在 Role.GetRoleByID 中,表示数据读取器命令已打开。没错,但我如何使用读者提供的信息调用 Role.GetRoleByID。

我用 C# 和 ASP.NET 编写代码

最佳答案

看起来您的 Role.GetRoleByID 将尝试重用该连接。

选项:

  • GetByID 中的 SqlDataReader 中获取您需要的数据,关闭该读取器,然后调用 Role.GetRoleByID(所以你一次只有一个活跃的读者)
  • 启用多个事件结果集 (MARS) - 我不能说我对此有任何经验
  • 使每个方法使用单独的连接以减少方法之间的依赖性。请注意,连接池将使打开/关闭变得相当便宜。

如果我是你,我会选择第一个选项——或者可能是最后一个。我还会使用 using 语句自动关闭阅读器:

private const string GetUserByIdSql =
"Select Name, Email, LastLogin, FK_Role_ID from Users where ID=@id";

public static Users GetByID(int ID, SqlConnection connection)
{
var sql = ;
Users user;
int roleId;
using (var command = new SqlCommand(GetUserByIdSql, connection))
{
command.Parameters.Add(new SqlParameter("id", ID));
using (var reader = command.ExecuteReader())
{
if (!reader.Read())
{
return null;
}
user = new Users
{
Name = reader.GetString(0),
Email = reader.GetString(1),
LastLogin = reader.GetString(2),
};
// Remember this so we can call GetRoleByID after closing the reader
roleID = reader.GetInt32(3);
}
}
user.Role = Role.GetRoleByID(roleID, connection);
return user;
}

作为第四个选项 - 为什么不在现有查询中执行 GetRoleByID 所需的连接?这意味着您只需要访问一次数据库。

关于c# - DataReader 已经打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8952331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com