С dbDataReaders и "Using" вам все еще нужно вызывать Close?

Хорошо, если я помещаю dbDataReader в оператор "Using", мне все равно нужно явно вызвать dbDataReader.Close. В документации.net говорится, что "Использование" соединения автоматически закрывает его. В приведенном ниже примере из MSDN он показывает dbDataReader без "Using" и явно закрывает его:

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

И тогда вам не нужно явно вызывать.Close on Reader?

заранее спасибо

3 ответа

В используемом вами фрагменте кода вам не нужно явно вызывать.Close on the reader. Тем не менее, это хорошая привычка. Явно закройте ридер и соединение, как только вы закончите их использовать.

Для меня лучшая практика не является
Попробуйте, поймать, наконец, обработать любые исключения 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 на 100% избыточно Dispose, using звонки Dispose безопасным способом. Просто всегда вкладывайте свои ресурсы в using блок. Это сделано для этого. Это безопасно по конструкции. Это легко проверить и сразу увидеть, что это правильно.

Не нужно звонить Close, Это избыточно и сбивает с толку. Просто всегда следуйте using привычка, если можешь.

Обработка ресурсов в C# и VB.NET очень проста. Просто используйте using!

Если вам требуется обработка ошибок, просто добавьте try-catch внутри или снаружи using,

Другие вопросы по тегам