您的位置:首页 > 其它

关于IDataReader的释放

2015-08-04 10:32 274 查看

关于IDataReader的释放

起初使用IDataReader时并不是很了解。以为执行完 cmd.ExecuteReader();数据库就可以关闭了。但是发现没有数据返回,代码如下

<span style="font-family:SimHei;font-size:18px;">    public  IDataReader MyDataReader(IDbCommand _cmd)
{
if (_cmd == null)
return null;
try
{
conn.Open();
_cmd.Connection = conn;
IDataReader dr = _cmd.ExecuteReader();
conn.Close();
return dr;
}
catch (Exception e)
{
}
}</span>

从上面的代码来看,当返回dr时数据库连接已经关闭了,然而还没有获得数据。在数据没读到之前数据库连接不能关闭。参考了微软写的数据库帮助类。其中有这样的代码

<span style="font-family:SimHei;font-size:18px;">  private static SqlDataReader ExecuteReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, SqlConnectionOwnership connectionOwnership)
{
if( connection == null ) throw new ArgumentNullException( "connection" );
bool mustCloseConnection = false;
// 创建命令
SqlCommand cmd = new SqlCommand();
try
{
PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection );

// 创建数据阅读器
SqlDataReader dataReader;
if (connectionOwnership == SqlConnectionOwnership.External)
{
dataReader = cmd.ExecuteReader();
}
else
{
dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}

// 清除参数,以便再次使用..
// HACK: There is a problem here, the output parameter values are fletched
// when the reader is closed, so if the parameters are detached from the command
// then the SqlReader can磘 set its values.
// When this happen, the parameters can磘 be used again in other command.
bool canClear = true;
foreach(SqlParameter commandParameter in cmd.Parameters)
{
if (commandParameter.Direction != ParameterDirection.Input)
canClear = false;
}

if (canClear)
{
cmd.Parameters.Clear();
}
return dataReader;
}
catch
{
if( mustCloseConnection )
connection.Close();
throw;
}
}</span>
没有直接关闭数据库连接。而是在调用完这个函数之后释放数据库连接。其中
dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
CommandBehavior.CloseConnection的意思是:如果关闭相关联的 DataReader对象,则关联的Connection对象也将关闭。从此我们了解到DataReader对象不应在数据库帮助类中关闭,而是应该在调用该函数之后释放。

有关微软的数据帮助类

下载地址:http://download.csdn.net/detail/awakeningwolf/8958137
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: