数据访问层的辅助类中有这样一个方法
public static SqlDataReader GetDataReaderByProc(string ProceName, SqlParameter[] paras)
{
cn = new SqlConnection(constr);
cn.Open();
using (SqlCommand cm = new SqlCommand())
{
cm.CommandText = ProceName;
cm.CommandType = CommandType.StoredProcedure;
cm.Connection = cn;
cm.Parameters.AddRange(paras);
SqlDataReader dr = cm.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
}
数据访问类中某一个DAO类有这样一个方法
public static SqlDataReader GetUserCanCreateArttype(int UserID)
{
SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@UserID", UserID) };
return Dbhelper.GetDataReaderByProc("P_GetUserCanCreateArttype", paras);
}
业务逻辑类中对应的BLO中有这样一个方法
public static System.Data.SqlClient.SqlDataReader GetUserCanCreateArttype(int UserID)
{
return ArticleTypeService.GetUserCanCreateArttype(UserID);
}
最关键的问题来了
在表示层我写了这一个代码
using (System.Data.SqlClient.SqlDataReader dr = ArticleTypeManager.GetUserCanCreateArttype(UserID))
{
}
我需要问的问题是如果这个datareader释放掉了.我的connection是否释放了?CommandBehavior.CloseConnection会在datareader关闭的时候关闭连接。但是我现在传递的这个datareader还是原先的datareader吗?
public static SqlDataReader GetDataReaderByProc(string ProceName, SqlParameter[] paras)
{
cn = new SqlConnection(constr);
cn.Open();
using (SqlCommand cm = new SqlCommand())
{
cm.CommandText = ProceName;
cm.CommandType = CommandType.StoredProcedure;
cm.Connection = cn;
cm.Parameters.AddRange(paras);
SqlDataReader dr = cm.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
}
数据访问类中某一个DAO类有这样一个方法
public static SqlDataReader GetUserCanCreateArttype(int UserID)
{
SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@UserID", UserID) };
return Dbhelper.GetDataReaderByProc("P_GetUserCanCreateArttype", paras);
}
业务逻辑类中对应的BLO中有这样一个方法
public static System.Data.SqlClient.SqlDataReader GetUserCanCreateArttype(int UserID)
{
return ArticleTypeService.GetUserCanCreateArttype(UserID);
}
最关键的问题来了
在表示层我写了这一个代码
using (System.Data.SqlClient.SqlDataReader dr = ArticleTypeManager.GetUserCanCreateArttype(UserID))
{
}
我需要问的问题是如果这个datareader释放掉了.我的connection是否释放了?CommandBehavior.CloseConnection会在datareader关闭的时候关闭连接。但是我现在传递的这个datareader还是原先的datareader吗?
这种读库方式为连接模式,即在保持数据库连接的情况下,读取大量的数据集,如果连接断开了,datareader也就无法正常读取了还有一种模式为断开模式,即非连接模式,在无连接模式下,需要处理的数据库服务器中的数据在本地有一个副本,通常保存在DataSet/DataTable中,ADO.NET通过数据适配器(DataAdapter)将本地数据和数据库服务器关联起来;在数据库服务器中取得数据后,数据库适配器断开与服务器的连接,对数据的修改都通过修改本地DataSet完成,然后再通过数据适配器更新到服务器。
2.datareader的释放并没影响到连接,除非你手动的conn.Close();
3.只要你当前的连接未释放,那么传递的总归是你之前的datareader ,只是创建了同一个对象的不用引用而已,最终操作的还是这个对象
/// <summary>
/// 常见的获取SqlDataReader方法
/// 通常的数据访问层都会提供这个方法
/// </summary>
static SqlDataReader GetReader()
{
//通过连接字符串获取连接
SqlConnection con = new SqlConnection(conn_String);
try
{
//打开连接,执行查询
//并且返回SqlDataReader
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = Sql;
SqlDataReader dr = cmd.ExecuteReader();
return dr;
}
finally
{
}
}
正如代码注释里描述的那样,这样的方法既不能关闭连接,也不能保持连接打开状态。很多系统为了解决这样两难的境地,只能放弃使用Reader模式的数据源,或者把连接对象交给方法调用者,以便进行关闭。
而CommandBehavior.CloseConnection的功能恰好就是为了避免类似的尴尬境地,它能够保证当SqlDataReader对象被关闭时,其依赖的连接也会被自动关闭。static SqlDataReader GetReader()
{
//通过连接字符串获取连接
SqlConnection con = new SqlConnection(conn_String);
try
{
//打开连接,执行查询
//并且返回SqlDataReader
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = Sql;
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
} catch
{
con.Close();
throw;
}}
摘自http://www.cnblogs.com/agian/articles/1648835.html