是否有必要手动closures和处理SqlDataReader?

我在这里使用遗留代码,并且有许多SqlDataReader实例从不closures或处理。 连接已closures,但我不确定是否需要手动pipe理读写器。

这是否会导致性能下降?

尽量避免使用这样的读者:

 SqlConnection connection = new SqlConnection("connection string"); SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection); SqlDataReader reader = cmd.ExecuteReader(); connection.Open(); if (reader != null) { while (reader.Read()) { //do something } } reader.Close(); // <- too easy to forget reader.Dispose(); // <- too easy to forget connection.Close(); // <- too easy to forget 

相反,将它们包装在使用语句中:

 using(SqlConnection connection = new SqlConnection("connection string")) { connection.Open(); using(SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection)) { using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader != null) { while (reader.Read()) { //do something } } } // reader closed and disposed up here } // command disposed here } //connection closed and disposed here 

使用声明将确保正确处理对象和释放资源。

如果你忘记了,那么你将把清理工作留给垃圾收集器,这可能需要一段时间。

请注意,使用SqlCommand.ExecuteReader()实例化一个SqlDataReader将不会closures/处理底层连接。

有两种常见的模式。 首先,读者在连接范围内打开和closures:

 using(SqlConnection connection = ...) { connection.Open(); ... using(SqlCommand command = ...) { using(SqlDataReader reader = command.ExecuteReader()) { ... do your stuff ... } // reader is closed/disposed here } // command is closed/disposed here } // connection is closed/disposed here 

有时用数据访问方法打开一个连接并返回一个阅读器是很方便的。 在这种情况下,重要的是使用CommandBehavior.CloseConnection打开返回的阅读器,以便closures/处置阅读器将closures底层连接。 模式看起来像这样:

 public SqlDataReader ExecuteReader(string commandText) { SqlConnection connection = new SqlConnection(...); try { connection.Open(); using(SqlCommand command = new SqlCommand(commandText, connection)) { return command.ExecuteReader(CommandBehavior.CloseConnection); } } catch { // Close connection before rethrowing connection.Close(); throw; } } 

而调用代码只需要这样configuration阅读器即可:

 using(SqlDataReader reader = ExecuteReader(...)) { ... do your stuff ... } // reader and connection are closed here. 

为了安全起见,请将每个SqlDataReader对象包装在using语句中 。

只需用“using”语句包装你的SQLDataReader即可。 这应该照顾你的大部分问题。