2016-12-14 3 views
-1

Когда я запускаю анализа кода с помощью следующего кода:Как я могу предотвратить повторное удаление этого кода несколькими объектами?

Protected Function GetOrderEntry() As IList(Of OE) 
    Dim results As IList(Of OE) = New List(Of OE)() 
    Using connection As IDbConnection = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection() 
     connection.ConnectionString = ConfigurationManager.AppSettings("OrderEnterConnection") 
     Using command As IDbCommand = connection.CreateCommand() 
      command.CommandTimeout = 120 
      command.CommandText = "Exec up_ViewOrderDetail_2012_Order '" & MemberNo1.Value & "','" & CustNo.Value & "','DEFAULT','" & OrderNo.Value & "','" & DeliveryDate.SelectedDate & "','','','','1'" 
      connection.Open() 
      Try 
       Dim reader As IDataReader = command.ExecuteReader() 
       results = PopulateGrid(reader) 
      Catch ex As SqlException 
       results.Clear() 
       connection.Close() 
      End Try 
     End Using 
    End Using 
    Return results 
End Function 

... Я получаю,

"CA2202 Не бросайте объекты Object„соединение“несколько раз может быть расположено более один раз в методе «OrderConfirm.GetOrderEntry()». Для того, чтобы избежать генерации System.ObjectDisposedException не следует вызывать Dispose больше, чем один раз на объекте "

Курсор находится на последней строке «End Using»; howis это рассматривается как двойное удаление объектов? Разве оба блока «Использование» не должны быть прекращены таким образом?

+3

http://stackoverflow.com/q/14706523/1070452 Там нет необходимости, чтобы закрыть соединение, утилизацией он делает это. Этот читатель, с другой стороны, также должен быть удален (ну, во всяком случае, они IDisposable) – Plutonix

ответ

0

Я попытался удалить connection.createcommand И connection.Close(). И он работал отлично

Protected Function GetOrderEntry() As IList(Of OE) 
    Dim results As IList(Of OE) = New List(Of OE)() 
    Using connection As IDbConnection = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection() 
     connection.ConnectionString = ConfigurationManager.AppSettings("OrderEnterConnection") 
     Using command As New IDbCommand 
      Command.connection = connection 
      command.CommandTimeout = 120 
      command.CommandText = "Exec up_ViewOrderDetail_2012_Order '" & MemberNo1.Value & "','" & CustNo.Value & "','DEFAULT','" & OrderNo.Value & "','" & DeliveryDate.SelectedDate & "','','','','1'" 
      connection.Open() 
      Try 
       Dim reader As IDataReader = command.ExecuteReader() 
       results = PopulateGrid(reader) 
       Reader.close() 
      Catch ex As SqlException 
       results.Clear() 

      End Try 
     End Using 
    End Using 
    Return results 
End Function 
+1

Я не думаю, что 'Использование команды As New IDbCommand' даже скомпилируется, что делает зеленую галочку интересной! ;-) Предположительно, 'connection.CreateCommand()' использовался, чтобы сделать провайдера кода агностиком, так что же было использовано вместо этого? И действительно ли он удалял вызов 'connection.Close()', который избавился от сообщения, потому что согласно документам «Close and Dispose функционально эквивалентны»? – Mark

+0

Бит, который меня смущает еще больше, заключается в том, что 'IDisposable' запекается в компилятор, но я не верю, что компилятор дает два diddly о методе IDbConnection.Close, поэтому удаление этого не должно иметь никакого значения. .. 'using' вызывает' Dispose' на 'IDisposable' - он не заботится о других интерфейсах. – Charleh

+0

@Charleh Сообщения CA * исходят из анализа кода, а не компилятора, поэтому я полагаю, что они могут быть более тщательными в том, что они проверяют. Сначала я должен был проверить [документы] (https://msdn.microsoft.com/en-us/library/ms182334.aspx), поскольку они заявляют: «Реализация метода содержит пути к кодам, которые могут вызвать несколько вызовов для IDisposable. или эквивалент Dispose, например метод Close() для некоторых типов, на одном и том же объекте. " - поэтому я думаю, что это вызов 'connection.Close()' в дополнение к 'Using', который вызвал предупреждение. – Mark

Смежные вопросы