我有一个用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,尽管它不是(我在服务器上检查过-它是关闭的,因为处于非活动状态)。有没有更好的方法来检查连接状态?
1条答案
按热度按时间rdrgkggo1#
你不是我见过的第一个用这种方法的人。不要。很糟糕。只需在需要的地方创建和销毁连接对象。扔掉那些垃圾
AConn
菲尔德和那个checkConn
方法并这样做:有时,使用字段来保存对ado.net对象的引用是个好主意。现在不是那种时候。默认情况下,应根据需要创建ado.net对象。
ado.net连接对象存在于较高级别,而实际数据库连接存在于较低级别。ado.net连接专门用于在需要时创建、尽可能晚地打开和尽可能早地关闭。ado.net为您管理底层数据库连接。如果一个ado.net连接对象打开了10分钟,而大部分时间都没有数据通过它,那就是做错了。