gpt4 book ai didi

c# - 在 SQLDataReader 上使用

转载 作者:可可西里 更新时间:2023-11-01 08:33:46 26 4
gpt4 key购买 nike

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

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() 方法,我需要将阅读器放在 using 中吗? (现在根据我之前的帖子,我的理解是任何使用 IDisposable 的对象都需要放在 using 中,而 SQLDataReader 继承来自IDisposable,所以我需要把它放上去。我的判断正确吗?)我只是很困惑,因为它不是一个新对象,它会在处理一个简单的引用对象时引起任何问题指向命令的指针?

非常感谢

最佳答案

我想你错了。 dr 是对 cmd.ExecuteReader 返回的对象的引用,这将是一个新对象。在您的示例中,没有任何东西会处理 dr,所以是的,它需要在 using 中,或手动处理。

您关于IDisposable 实现者需要 using 的判断是不正确的。它们在外面会正常工作。 using 语句只是 try ... finally 的语法糖。实现 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
}
}
}

关于c# - 在 SQLDataReader 上使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3386770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com