我知道建议使用带有sqldatareader的using语句,但我想知道在将控件的数据源直接设置为数据源时是否有必要。
在我的代码的某些地方,我这样做.....
using (SqlDataReader reader = getReader())
{
while (reader.Read())
{
// do stuff with data
}
}
绑定到控件时,我这样做.....
ddlCustomer.DataSource = getReader(); // get Reader returns a sqldataReader
ddlCustomer.DataBind();
在第二种情况下,我是否需要使用using语句。我是否必须首先在using语句中声明一个SqlDataReader,然后将DataSource设置为该对象。似乎在代码中更混乱,所以我希望绑定到SqlDataReader的SqlDataReader配置。
谢谢
答案 0 :(得分:2)
在某些时候,需要调用DataReader上的Dispose()方法。终结者会在将来的某个时候为你做这件事,但那可能要迟到了。
所以,问题就变成了,“如果我不这样做,谁会?”
DataBind()方法有可能会识别分配给DataSource
属性的对象是IDisposable,并在完成数据绑定时调用Dispose,但我不会指望它。
所以,是的,我会选择using{}
。
using (SqlDataReader reader = getReader())
{
ddlCustomer.DataSource = reader;
ddlCustomer.DataBind();
}
答案 1 :(得分:1)
如果我正确地读你的问题,是的,你必须在using语句中声明SqlDataReader:
using (SqlDataReader reader = getReader())
{
ddlCustomer.DataSource = reader; // get Reader returns a sqldataReader
ddlCustomer.DataBind();
}
绑定阅读器不会明确处理它。如果你想这样做,你可以将它重构为一个方法,将读者绑定到一个控件:
public void BindControl(Control Ctl, SqlDataReader reader)
{
using (reader)
{
ddlCustomer.DataSource = reader; // get Reader returns a sqldataReader
ddlCustomer.DataBind();
}
}
答案 2 :(得分:0)
BaseDataBoundControl
并未承诺会处置其数据源,因此呼叫者必须自行承担责任。