MySQL的连接状态无法正常工作

时间:2018-08-25 11:27:12

标签: mysql vb.net mysqlconnection

我有用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分钟,然后再次单击button2。 它通过“ checkConn”而没有错误,并说connectionstate为“ open”,但是,当涉及到“ cmdCheck.ExecuteNonQuery()”行时,抛出异常:“致命错误...”。问题是,连接状态(在checkConn()中)报告Connection.Open,尽管不是(我在服务器上检查了-由于不活动而关闭了)。 有没有更好的方法来检查连接状态?

1 个答案:

答案 0 :(得分:3)

您不是我使用这种方法见过的第一个人。别。这不好。只需在需要的地方创建和销毁连接对象即可。摆脱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分钟,而在大多数时间里没有数据通过它,则您做错了。