关闭连接后访问MySQL

时间:2014-08-13 17:13:28

标签: mysql vb.net

我关闭它后访问我的数据库MySQL时遇到问题。我使用MySql官方网站上的Windows Form和MySql Connector连接到datebase。我在XAMPP中使用MySQL。

如果我打开连接,我可以进行简单的查询。 但是当我关闭连接时,我仍然可以执行此查询。为什么?

这是我的代码:

Imports MySql.Data.MySqlClient

Public Class Form1
    Dim polaczenieMySql As New MySqlConnection
    Dim mySQL As PolaczenieMySQL

    Public Sub New()
        InitializeComponent()
        mySQL = New PolaczenieMySQL(Me)
    End Sub

    Private Sub btnPolaczMySQL_Click(sender As Object, e As EventArgs) Handles btnPolaczMySQL.Click
        mySQL.Polacz()
    End Sub

    Private Sub RozlaczMySQL_Click(sender As Object, e As EventArgs) Handles btnRozlaczMySQL.Click
        mySQL.Rozlacz()
    End Sub

    Private Sub btnZapytanie_Click(sender As Object, e As EventArgs) Handles btnZapytanieMySQL.Click
        Dim zapytanie As String = "SELECT title, price, book_id from books"
        mySQL.WykonajZapytanie(zapytanie)
    End Sub
End Class

我的连接类:

Imports MySql.Data.MySqlClient

Public Class PolaczenieMySQL
    Dim polaczenie As MySqlConnection = New MySqlConnection()
    Dim glowneOkno As Form1

    Public Sub New(form As Form1)
        glowneOkno = form
    End Sub

    Public Sub Polacz()
        polaczenie.ConnectionString = ("server=localhost;user id=root;password=;database=test")

        Try
            polaczenie.Open()
            MessageBox.Show("Połączono z bazą danych MySQL.")
            glowneOkno.labelPolaczenieMySQL.Text = "Połączono"
            glowneOkno.labelPolaczenieMySQL.ForeColor = Color.Green
        Catch myerror As MySqlException
            MessageBox.Show("Nie udało się połączyć z bazą danych MySQL: " & myerror.Message)
        End Try
    End Sub

    Public Sub Rozlacz()
        Try
            polaczenie.Close()
            MessageBox.Show("Rozłączono z bazy danych MySQL.")
            glowneOkno.labelPolaczenieMySQL.Text = "Nie połączono"
            glowneOkno.labelPolaczenieMySQL.ForeColor = Color.Red
        Catch myerror As MySqlException
            MessageBox.Show("Błąd rozłączenia z bazy danych MySQL: " & myerror.Message)
        Finally
            polaczenie.Dispose()
        End Try
    End Sub

    Public Sub WykonajZapytanie(ByVal zapytanie As String)
        Dim SDA As New MySqlDataAdapter
        Dim dbDataSet As New DataTable
        Dim bSource As New BindingSource

        Try
            Dim komenda As MySqlCommand = New MySqlCommand(zapytanie, polaczenie)
            SDA.SelectCommand = komenda
            SDA.Fill(dbDataSet)
            bSource.DataSource = dbDataSet
            glowneOkno.DataGridViewMySQL.DataSource = bSource
            SDA.Update(dbDataSet)
        Catch ex As MySqlException
            MessageBox.Show("Nie jesteś połączony z bazą")
        End Try   
    End Sub

End Class

正如我之前所说,在关闭连接(mySQL.Rozlacz())后,我仍然可以进行查询(mySQL.WykonajZapytanie(zapytanie))。这有什么问题?

PS。对不起我的波兰名字

1 个答案:

答案 0 :(得分:2)

如果您查看有关DbDataAdapter的文档,您可以阅读此评论

  

Fill方法使用SELECT从数据源检索数据   声明。与select命令关联的IDbConnection对象   必须有效,但不需要打开。如果是IDbConnection   在调用Fill之前关闭它,它被打开以检索数据和   然后关闭如果在调用Fill之前连接已打开,则为   仍然开放。

MySqlDataAdapter继承自DbDataAdapter,并且没有覆盖Fill方法,因此它是继承的类(DbDataAdapter),它与相关命令一起使用,重新打开已关闭的连接然后关闭它。

修改 您还询问了如何避免这种行为,您可以在类PolaczenieMySQL中添加一个布尔属性来维护MySqlConnection的状态

Private _isDead As Boolean

Public Property IsDead() As Boolean
    Get
        Return _isDead
    End Get
    Private Set(ByVal value As String)
        _isDead = value
    End Set
End Property

现在,您可以在打开连接时将此属性设置为False,并在关闭连接时将其设置为True 然后在执行WykonajZapytanie sub

之前检查其值
Public Sub WykonajZapytanie(ByVal zapytanie As String)

    Dim SDA As New MySqlDataAdapter
    Dim dbDataSet As New DataTable
    Dim bSource As New BindingSource

    if Me.IsDead Then
        Throw new Exception("Invalid usage of this class")
    End If
    ......
End Sub

请注意,使用MySqlConnection属性State

进行更简单的检查
if polaczenie.State <> ConnectionState.Open Then
    ......

但是,考虑到您在Rozlacz方法中处置连接,我建议实施第一个解决方法。

最后,我真的认为你应该改变整个使用模式。应以相同的方法打开,使用和关闭连接。您的实际基础设施使这变得不可最好摆脱PolaczRozlacz并使用上述模式,而不需要连接的全局变量。