Состояние соединения MySQL не работает должным образом

У меня есть форма заявки, написанная на 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 ответ

Решение

Вы не первый человек, которого я видел, используя такой метод. Не. Это плохо. Просто создайте и уничтожьте объекты подключения, как и где они вам нужны. Избавиться от 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 минут без передачи данных по нему большую часть времени, вы делаете это неправильно.

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