将控件的数据源设置为sqldatareader时是否需要using语句

时间:2010-08-25 19:31:56

标签: asp.net

我知道建议使用带有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配置。

谢谢

3 个答案:

答案 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并未承诺会处置其数据源,因此呼叫者必须自行承担责任。