mysql连接状态未按预期工作

shstlldc  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(314)

我有一个用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”时没有错误,并且它说connectionstate是“open”,但是当它到达“cmdcheck.executenonquery()”行时,异常抛出:“致命错误…”。问题是连接状态(在checkconn()中)报告connection.open,尽管它不是(我在服务器上检查过-它是关闭的,因为处于非活动状态)。有没有更好的方法来检查连接状态?

rdrgkggo

rdrgkggo1#

你不是我见过的第一个用这种方法的人。不要。很糟糕。只需在需要的地方创建和销毁连接对象。扔掉那些垃圾 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分钟,而大部分时间都没有数据通过它,那就是做错了。

相关问题