我关闭它后访问我的数据库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。对不起我的波兰名字
答案 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
方法中处置连接,我建议实施第一个解决方法。
最后,我真的认为你应该改变整个使用模式。应以相同的方法打开,使用和关闭连接。您的实际基础设施使这变得不可最好摆脱Polacz
和Rozlacz
并使用上述模式,而不需要连接的全局变量。