好的,如果我把一个dbDataReader在"Using"语句,我仍然需要显式地调用dbDataReader. close。在。net文档中说"使用"一个连接会自动关闭它。在下面的MSDN示例中,它显示了一个没有"Using"的dbDataReader,并显式地关闭了它:
Public Sub ReadData(ByVal connectionString As String)
Dim queryString As String = _
"SELECT OrderID, CustomerID FROM Orders"
Using connection As New OdbcConnection(connectionString)
Dim command As New OdbcCommand(queryString, connection)
connection.Open()
Dim reader As OdbcDataReader
reader = command.ExecuteReader()
' Always call Read before accessing data.
While reader.Read()
Console.WriteLine(reader.GetInt32(0) & ", " & reader.GetString(1))
End While
' Always call Close when done reading.
reader.Close()
End Using
End Sub
所以这不是更干净,更有效吗:
Public Sub ReadData(ByVal connectionString As String)
Dim queryString As String = _
"SELECT OrderID, CustomerID FROM Orders"
Using connection As New OdbcConnection(connectionString)
Using command As New OdbcCommand(queryString, connection)
connection.Open()
Using reader = command.ExecuteReader()
' Always call Read before accessing data.
While reader.Read()
Console.WriteLine(reader.GetInt32(0) & ", " & reader.GetString(1))
End While
End Using
End Using
End Using
End Sub
那么你就不需要显式地调用Reader上的。close了?
Thanks in advance
在您正在使用的代码片段中,您不需要显式地对阅读器调用. close。然而,这是一个值得养成的好习惯。使用完阅读器和连接后,立即显式关闭它们。
对于我来说,最佳实践是两者都不是
一个try, catch, finally来处理任何SQL异常
SqlConnection sqlConnRW = new SqlConnection(sqlConnStringLibDef);
try
{
sqlConnRW.Open();
SqlCommand sqlCmd = sqlConnRW.CreateCommand();
sqlCmd.CommandText = "select column from table";
SqlDataReader rdr = sqlCmd.ExecuteReader();
while (rdr.Read())
{ }
rdr.Close();
}
catch (SqlException Ex)
{
Debug.WriteLine(Ex.Message);
Debug.WriteLine(Ex.Number);
}
finally
{
sqlConnRW.Close();
}
Close
是Dispose
的100%冗余。using
安全呼叫Dispose
。总是把你的资源放在using
块中。它就是为此目的而制造的。它的施工是安全的。这很容易检查,并立即看到它是正确的。
无需调用Close
。这是多余的,令人困惑的。如果可以的话,请始终遵循using
习惯。
c#和VB中的资源处理。NET非常简单。
请使用using
!如果您需要错误处理,只需在using
的内部或外部添加一个try-catch
。