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非常陌生,所以我正在尝试正确地使用它。