我有一个包含SqlDataReader
的基类,它使用存储过程获取数据,这很有效,直到我返回数据读取器,说连接为空。
有没有人有任何想法?这是我的代码:
public SqlDataReader GetDataReader(string QueryName, SqlParameter[] Params)
{
SqlConnection conn = new SqlConnection(this.ConnectionString);
SqlDataReader reader;
using (conn)
{
SqlCommand command = new SqlCommand(QueryName,conn);
command.CommandType = CommandType.StoredProcedure;
if(Params !=null)
command.Parameters.Add(Params);
conn.Open();
reader = command.ExecuteReader();
}
// conn.Close();
return reader;
}
如果你注意到,我有关闭部分注释掉,这是我试图让它工作,由于某种原因,当返回datareader备份它被设置为关闭???
谢谢!
答案 0 :(得分:2)
因为您的连接在返回阅读器之前已关闭并在使用块中处理。见this SO post
答案 1 :(得分:2)
使用(conn)块完成时,它会关闭数据库连接,这就是您收到该错误的原因。只需删除该行。
答案 2 :(得分:2)
您正在使用“使用”,其功能与调用conn.Close()相同。
答案 3 :(得分:2)
当您使用using (conn)
时,它会自动处理conn
对象
答案 4 :(得分:2)
您想要执行以下操作:
SqlDataReader dr = command.ExecuteReader(CommandBehavior.CloseConnection)
并且不要关闭连接。当您关闭datareader时,如果您使用上面的代码,它将为您关闭它。
答案 5 :(得分:1)
DataReader是一个连接对象。意味着从DataReader获取数据,此时需要打开下面的连接。如果您使用在断开连接模式下工作的DataSet,则情况并非如此。在返回DataReader之前,您正在关闭代码中的连接。所以DataReader无法为您提供任何数据。
更好的设计替代方案可能是从外部提供连接(依赖注入)。