C# 在SQLDataReader上使用

C# 在SQLDataReader上使用,c#,dispose,sqldatareader,using-statement,C#,Dispose,Sqldatareader,Using Statement,我知道我之前问过一个相关的问题。我只是有另一个想法 using (SqlConnection conn = new SqlConnection('blah blah')) { using(SqlCommand cmd = new SqlCommand(sqlStatement, conn)) { conn.open(); // *** do I need to put this in using as well? *** SqlD

我知道我之前问过一个相关的问题。我只是有另一个想法

using (SqlConnection conn = new SqlConnection('blah blah'))
{
    using(SqlCommand cmd = new SqlCommand(sqlStatement, conn))
    {
        conn.open();

        // *** do I need to put this in using as well? ***
        SqlDataReader dr = cmd.ExecuteReader() 
        {
            While(dr.Read())
            {
                //read here
            }
        }
    }
}
其论点是:由于
SqlDataReader
dr
对象不像连接或命令对象那样是一个新对象,它只是指向
cmd.ExecuteReader()
方法的引用,我是否需要使用
将读取器放在
中。(现在根据我之前的帖子,我的理解是,任何使用
IDisposable
的对象都需要使用
IDisposable
放入
,而
SQLDataReader
继承自
IDisposable
,所以我需要将其放入。我的判断正确吗?),在处理一个仅仅是指向该命令的引用指针的对象时,它会导致任何问题吗


非常感谢

您应该将数据读取器包装在using语句中,因为ExecuteReader方法正在创建一个新的数据读取器实例,该实例也应该被处理。

我认为您错了。
dr
是对
cmd.ExecuteReader
返回的对象的引用,它将成为一个新对象。在您的示例中,没有任何内容将处置
dr
,因此,是的,它需要在
中使用
,或者手动处置

您关于
IDisposable
实现者需要使用
的判断是不正确的。它们在外面可以正常工作。使用
语句的
只是
try的语法糖。。。最后
。实现
IDisposable
的东西应该调用
Dispose
,因为它们发出信号,表示需要以确定性的方式处理某些状态

请注意,如果不调用
Dispose
,这并不总是一个问题。一些对象还实现了终结器,它将由垃圾收集器触发。如果它们不实现终结器,则可能会保留未声明的非托管内存。在您的应用程序关闭之前,这将保持未声明状态。所有托管内存最终都会被回收,除非它不能用于垃圾收集

重写:

using (SqlConnection conn = new SqlConnection('blah blah')) 
using(SqlCommand cmd = new SqlCommand(sqlStatement, conn)) 
{
   conn.open(); 
   using (SqlDataReader dr = cmd.ExecuteReader())
   { 
        while (dr.Read()) 
        { 
           //read here 
        } 
   } 
} 

“cmd.ExecuteReader”是一种方法引用。“cmd.ExecuteReader()”(注意括号)是一个方法调用。是的,我知道使用简单地转换为try..finally块,我也可以调用dispose my self。但我认为最好养成在using中包装代码块的习惯,因为我可能会忘记将代码块放入try中。谢谢你的回复。:)没关系:-)我还要提到SqlDataReader是一个新对象,或者至少是对方法调用返回的对象的引用,而不是对方法的引用。只是因为你用大写字母表达了这一点,这是不正确的。读卡器和连接/命令之间的唯一区别是您初始化了连接/命令,但没有初始化读卡器。最后你仍然有对所有对象的引用——不管你是否初始化了它们使用(SqlDataReader dr=cmd.ExecuteReader()){…}
部分之后需要code>,对吗?@TrevorNestman Close在dispose上被调用,但如果您愿意,也可以显式调用它。@AdamHouldsworth感谢您的响应/info!我对SqlConnection非常陌生,所以我正在尝试正确地使用它。