关闭连接后访问MySQL
关闭数据库MySQL后,我在访问数据库MySQL时遇到问题。我使用MySql官方网站上的Windows窗体和MySql连接器连接到数据库。我在XAMPP中使用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
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
,使用上述模式,而不需要全局变量进行连接。噢,就是这样。现在我明白了为什么我仍然可以访问。那么我怎样才能避免这种情况呢?我应该用什么代替填充法?