Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭连接后访问MySQL_Mysql_Vb.net - Fatal编程技术网

关闭连接后访问MySQL

关闭连接后访问MySQL,mysql,vb.net,Mysql,Vb.net,关闭数据库MySQL后,我在访问数据库MySQL时遇到问题。我使用MySql官方网站上的Windows窗体和MySql连接器连接到数据库。我在XAMPP中使用MySQL 如果我打开我的连接,我可以做一个简单的查询但当我关闭连接时,我仍然可以执行此查询。为什么? 这是我的密码: Imports MySql.Data.MySqlClient Public Class Form1 Dim polaczenieMySql As New MySqlConnection Dim mySQL

关闭数据库MySQL后,我在访问数据库MySQL时遇到问题。我使用MySql官方网站上的Windows窗体和MySql连接器连接到数据库。我在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)
)。这有什么问题


注:对不起,我的波兰名字

如果你看一下关于我的文件,你可以读一下这句话

Fill方法使用SELECT从数据源检索数据 陈述与select命令关联的IDbConnection对象 必须有效,但不需要打开。如果IDB连接 在调用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
    ......
如果polaczenie.State ConnectionState.Open然后
......
但是,考虑到在您的
Rozlacz
方法中您处理了连接,我建议您实施第一种解决方法


最后,我真的认为你应该改变整个使用模式。在需要时,应以相同的方法打开、使用和关闭连接。您的实际基础设施使得这不可能。最好去掉
Polacz
Rozlacz
,使用上述模式,而不需要全局变量进行连接。

噢,就是这样。现在我明白了为什么我仍然可以访问。那么我怎样才能避免这种情况呢?我应该用什么代替填充法?