Состояние соединения MySQL не работает должным образом - PullRequest
0 голосов
/ 25 августа 2018

У меня есть форма заявки, написанная на vb.net. Он использует MySqlClient:

Imports MySql.Data.MySqlClient

Public Class frmTest
Dim AConn As MySqlConnection
Dim errMsg as String = ""

Sub New()
    Try
        'Opens connection as forms open and keep it open
        If checkConn() = False Then Throw New Exception(ErrMsg)
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

Private Function checkConn() As Boolean
    Try
        'if connection is not initiated then initiate
        If IsNothing(AConn) Then AConn = New MySqlConnection(ConnSTR)

        'if connectionstate is any other than "open", reconnect  
        If AConn.State <> ConnectionState.Open Then
            closeConn()
            AConn.Open()
        End If

        Return True
    Catch ex As Exception
        ErrMsg = ex.Message
        Return False
    End Try
End Function

Sub closeConn()
    Try
        AConn.Close()
    Catch ex As Exception

    End Try
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles 
            Button2.Click
    Try
        If checkConn() = False then Throw New Exception(errMsg)
        Dim cmdCheck As New MySqlCommand("show databases;", AConn)
        cmdCheck.ExecuteNonQuery()
    Catch ex as Exception
        MsgBox(ex.Message)
    End Try
End Sub
End Class

Теперь, когда я открываю форму, она работает нормально. Соединение открывается, и, нажав, я получаю результат. Затем я оставляю форму бездействия на 10 минут и снова нажимаю кнопку2. Он передает «checkConn» без ошибок и говорит, что connectiontate «открыт», но, когда дело доходит до строки «cmdCheck.ExecuteNonQuery ()», возникает исключение: «Fatal error ...». Проблема в том, что состояние соединения (в checkConn ()) сообщает о Connection.Open, хотя это не так (я проверил на сервере - он закрыт из-за периода бездействия). Есть ли лучший способ проверить состояние соединения?

1 Ответ

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

Вы не первый человек, которого я видел, используя такой метод. Не. Это плохо. Просто создайте и уничтожьте объекты подключения, как и где они вам нужны. Избавьтесь от поля AConn и метода checkConn и сделайте так:

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Try
        Using AConn As New MySqlConnection(ConnSTR)
            Dim cmdCheck As New MySqlCommand("show databases;", AConn)
            AConn.Open()
            cmdCheck.ExecuteNonQuery()
        End Using
    Catch ex as Exception
        MsgBox(ex.Message)
    End Try
End Sub

Иногда бывает полезно использовать поля для хранения ссылок на объекты ADO.NET. Это не один из тех времен. Создание объектов ADO.NET по мере необходимости должно быть по умолчанию.

Объект соединения ADO.NET существует на высоком уровне, а фактическое соединение с базой данных существует на более низком уровне. Соединения ADO.NET специально предназначены для создания, когда они необходимы, открываются как можно позже и закрываются как можно раньше. ADO.NET управляет подключением к базе данных. Если у вас есть объект подключения ADO.NET, открытый в течение 10 минут без передачи данных по нему большую часть времени, вы делаете это неправильно.

...