最近碰到一个问题,就是在多层架构中datareader传递的问题。
结果发现总是报“阅读器关闭时 read的尝试无效。”,在网上查了两天,因为大多数代码都不涉及datareader传递的问题,我一度认为datareader不能够传递。我是调用了sqlhelper中的代码,所以开始一直没有怀疑过底层代码有什么问题。原来的代码如下:
public static DbDataReader ExecuteReader(string sql)
{
using (DbConnection conn = GetConncetion())
{
DbCommand cmd = GetCommand(conn);
DbDataReader myReader;
try
{
conn.Open();
SetCommand(cmd, sql, CommandType.Text, COMMANDTIME, null);
myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return myReader;
}
catch (DbException ex)
{
throw new Exception(ex.Message);
}
finally
{
cmd.Dispose();
conn.Close();
}
}
}
终于今天查到一个帖子,见我的网摘。才发现原来是using的问题。而且finally会在自动关闭conn,而不管reader是否传递。后来我把代码改成如下,终于运行通过了!
public static DbDataReader ExecuteReader(string sql)
{
//using (DbConnection conn = GetConncetion())
//{
DbConnection conn = GetConncetion();
DbCommand cmd = GetCommand(conn);
DbDataReader myReader;
try
{
conn.Open();
SetCommand(cmd, sql, CommandType.Text, COMMANDTIME, null);
myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return myReader;
}
catch (DbException ex)
{
throw new Exception(ex.Message);
}
// finally
// {
// cmd.Dispose();
// conn.Close();
// }
//}
}