这个真的可以吗第一种方法测试的结果是dr关闭了,connection也关闭了protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MSPetShop4;Integrated Security=True"))
{
SqlCommand command = new SqlCommand("select * from Product", conn);
conn.Open(); using (SqlDataReader rdr = command.ExecuteReader(CommandBehavior.CloseConnection))
{
GridView1.DataSource = rdr;
GridView1.DataBind();
Response.Write(rdr.IsClosed + "<br>");//结果为True
Response.Write(conn.State);//结果为False
}
}
}
}第二种方法测试 dr也关闭了,connection也关闭了
public partial class _Default : System.Web.UI.Page
{
public delegate void IDataReaderHandler(IDataReader reader);
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GetAuthor(new _Default.IDataReaderHandler(databind));
//using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MSPetShop4;Integrated Security=True"))
}
} public void GetAuthor(IDataReaderHandler handler)
{
using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MSPetShop4;Integrated Security=True"))
{
SqlCommand command = new SqlCommand("select * from Product", conn);
conn.Open(); using (SqlDataReader rdr = command.ExecuteReader(CommandBehavior.CloseConnection))
{
handler(rdr);
Response.Write(rdr.IsClosed + "<br>");//这样也是True
Response.Write(conn.State);//False
}
}
} public void databind(IDataReader dr)
{
GridView1.DataSource = dr;
GridView1.DataBind();
}
}这两种方法到底哪个才是真正的关闭了呢
{
if (!IsPostBack)
{
using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MSPetShop4;Integrated Security=True"))
{
SqlCommand command = new SqlCommand("select * from Product", conn);
conn.Open(); using (SqlDataReader rdr = command.ExecuteReader(CommandBehavior.CloseConnection))
{
GridView1.DataSource = rdr;
GridView1.DataBind();
Response.Write(rdr.IsClosed + "<br>");//结果为True
Response.Write(conn.State);//结果为False
}
}
}
}第二种方法测试 dr也关闭了,connection也关闭了
public partial class _Default : System.Web.UI.Page
{
public delegate void IDataReaderHandler(IDataReader reader);
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GetAuthor(new _Default.IDataReaderHandler(databind));
//using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MSPetShop4;Integrated Security=True"))
}
} public void GetAuthor(IDataReaderHandler handler)
{
using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MSPetShop4;Integrated Security=True"))
{
SqlCommand command = new SqlCommand("select * from Product", conn);
conn.Open(); using (SqlDataReader rdr = command.ExecuteReader(CommandBehavior.CloseConnection))
{
handler(rdr);
Response.Write(rdr.IsClosed + "<br>");//这样也是True
Response.Write(conn.State);//False
}
}
} public void databind(IDataReader dr)
{
GridView1.DataSource = dr;
GridView1.DataBind();
}
}这两种方法到底哪个才是真正的关闭了呢
解决方案 »
- jquery 获取asp:RadioButtonList 中选中的值
- gridview的数字列格式化之后如何重新转换为数值
- VS2005的sp1安装不了是什么原因?
- 显示查询时结果。怎么把下一条也显示出来。
- 如何在程序里把参数通过FORM的方式传递给另一个页面
- 为什么这样普遍的问题没有人解决
- IIS不能正常报错,遇到ASP错误直接报"该页无法显示".
- NHibernate里面的哪个工具NHibernate.Tool.hbm2net怎么使用?
- 论坛回复帖子自动识别网址加上链接怎么做?
- 新手问题,页面间传递数据的问题
- visual studio中进行dropdownlist绑定的cs编码
- DataGrid导出excel怎么设置表头样式?
LZ想说什么呢?
你这两种有区别吗?都使用USING,USING会自动调用Dispose()释放资源。
在USING的范围内的东东,会自动释放资源
释放什么?空间?如果你认为IDisposable接口就是用来释放空间的,就根本错了。对于SqlConnection和SqlDataReader执行Dispose,哪一个也不会释放空间啊!就你的两个代码来说,哪一个都可以,而且你的代码还有冗余动作。在根本不需要调用DbDataReader的Dispose方法时,如果写道using{}结构里边就有点画蛇添足的。说来说去,关键就是为了及时调用SqlConnection的Close方法(而且即使异常情况下也可以调用),而且根本不是为了释放什么SqlConnection的对象实例的内存空间,而是为了让其与底层物理连接脱离开,把底层的连接放到连接池里下一个SqlConnection对象实例使用(而当前的实例控件根本不需要立刻释放)。
一说到“释放资源”,很多人只能想到使用的内存字节释放掉这个概念。其实根本不是这个意思。比如说锁的释放、端口的释放、画笔的释放、独占文件的释放,等等这些资源提前释放,而不是等到GC来释放空间时才释放资源,是这个意思。
也可以放在委托里面,外面就可以不用了,using 会被编译成try-finall
public void databind(IDataReader dr)
{
//if(dr == null) throw ...
using (dr)
{
GridView1.DataSource = dr;
GridView1.DataBind();
}
}