Использование и Try / Catch блоков - PullRequest
0 голосов
/ 24 августа 2018

Я не очень разбираюсь в vb и унаследовал приложение от предыдущего программиста. Меня попросили запустить анализ Visual Studio для кода, чтобы внести изменения, так как приложение, казалось, вызывало проблемы с памятью. Я получил множество сообщений об удалении объекта несколько раз, например

Предупреждение CA2202 Объект 'myConnection' может быть размещен более одного раза в методе xxx '. Во избежание генерации исключения System.ObjectDisposedException не следует вызывать метод Dispose более одного раза для объекта

Просто, оберните это в блок, который я думал. Затем я обнаружил, что myConnection использовался в try / catch

JumpUpAgain:
Try
    myConnection.Open()
Catch ex As Exception
                LogIt("EXCEPTION", "Connection Error: " & ex.Message)
                myConnection.Close()
                SqlConnection.ClearAllPools()
                ConnectionString = Nothing
                conn = Nothing
                MySQLCmd = Nothing
                myConnection = Nothing

                Threading.Thread.Sleep(3000)

                If ErrorLoopCounter = 5 Then
                    LogItDetail("Exception", "Database Connection Process failed after 5 re-tries")
                    If Not FailedFiles.Contains(InputFileName) Then FailedFiles.Add(InputFileName)
                    LogItDetail("DEBUG", "Added file to Failed Files for email")
                    FileProcessFailed = True
                    Throw
                Else
                    ErrorLoopCounter += 1
                End If
                GoTo JumpUpAgain

 End Try

И объект myConnection требуется в следующем коде. Я уберу myConnection = Nothing из перехвата, но если я добавлю использование / конец с использованием вне этого блока try / catch, будет ли оно корректно удалено, если приложение выполнит команду Throw?

1 Ответ

0 голосов
/ 25 августа 2018

Блоки Using гарантируют, что ваши объекты БД закрыты и расположены (так же важно, как и закрытие), даже если есть ошибка.Вы должны быть вписаны в Try Catch, поскольку переменные, определенные внутри блоков, не видны за пределами блока.

    Private Sub OPCode2()
        Dim dt As New DataTable()
        'Keep your connections local
        Using cn As New MySqlConnection("Your Connection String")
            Using cmd As New MySqlCommand("Select * From YourTable", cn)
                Try
                    cn.Open()
                    Using dr As MySqlDataReader = cmd.ExecuteReader
                        dt.Load(dr) 'or whatever you want to do with your connection
                    End Using
                Catch
                    'Your logging logic here
                End Try
            End Using
        End Using
    End Sub
...