Я пытаюсь создать очень простую программу, которая подключается к базе данных MySQL с помощью VB.NET. Моя программа имеет только одну форму и одну метку. Я устанавливаю свою базу данных MySQL для таблицы и одного поля (a
VARCHAR) называется "Tab1". Я вручную вставил значение "ЗАКРЫТО" в поле Tab1, используя PHPMyAdmin. Я хочу, чтобы моя программа изменила значение поля на OPEN/CLOSED, и я также хочу, чтобы текст ярлыка в моей форме
для изменения тоже при нажатии.
До сих пор я добавил ссылку на MySQL.data для своего проекта и добавил:
Imports System
Imports System.Data
Imports MySql.Data.MySqlClient
В General_Declarations
Также я объявил глобальную переменную, содержащую соединение MySQL:
Public Class Form1
Dim conn As New MySqlConnection
Вот моя функция, которая соединяется с MySQL:
Private Function Connect(ByVal server As String, ByRef user As String, ByRef password As String, ByRef database As String)
' Connection string with MySQL Info
conn.ConnectionString = "server=" + server + ";" _
& "user id=" + user + ";" _
& "password=" + password + ";" _
& "database=" + database + ";"
Try
conn.Open()
Return True
Catch ex As MySqlException
Return MsgBox(ex.Message)
End Try
End Function
Я сделал программу для подключения к MySQL в Form_Load следующим образом:
Connect("db4free.net", "boomun", "*******", "boomdb")
И он прекрасно соединяется, но вот где у меня проблема.... Я хочу, чтобы поле менялось от ЗАКРЫТО к ОТКРЫТО, когда я нажимаю Label1. Он меняет OPEN на первый клик, но я получаю mysql Error Msgbox, говорящий: "Существует уже открытый DataReader, связанный с этим соединением, который должен быть закрыт первым". Как закрыть DataReader?
Вот что я до сих пор:
Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
Dim myCommand As New MySqlCommand
Dim myAdapter As New MySqlDataAdapter
Dim myData As MySqlDataReader
Dim SQL As String
SQL = "SELECT * FROM `boomtable` WHERE `Tab1` = 'CLOSED'"
myCommand.Connection = conn
myCommand.CommandText = SQL
myAdapter.SelectCommand = myCommand
Try
myData = myCommand.ExecuteReader()
myData.Read()
If myData.HasRows = 0 Then
Label1.Text = "CLOSED"
SQL = "UPDATE boomtable SET Tab1 = 'CLOSED' WHERE Tab1 = 'OPEN'"
myCommand.CommandText = SQL
myCommand.ExecuteNonQuery()
myData.Close()
Else
Label1.Text = "OPEN"
SQL = "UPDATE boomtable SET Tab1 = 'OPEN' WHERE Tab1 = 'CLOSED'"
myCommand.CommandText = SQL
myCommand.ExecuteNonQuery()
myData.Close()
End If
Catch ex As MySqlException
MsgBox(ex.Message)
End Try
End Sub
У меня есть myData.close()
, но я все еще получаю эту ошибку! Что дает?
Вот весь код проекта:
Imports System
Imports System.Data
Imports MySql.Data.MySqlClient
Public Class Form1
Dim conn As New MySqlConnection
Private Function Connect(ByVal server As String, ByRef user As String, ByRef password As String, ByRef database As String)
' Connection string with MySQL Info
conn.ConnectionString = "server=" + server + ";" _
& "user id=" + user + ";" _
& "password=" + password + ";" _
& "database=" + database + ";"
Try
conn.Open()
Return True
Catch ex As MySqlException
Return MsgBox(ex.Message)
End Try
End Function
Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
Dim myCommand As New MySqlCommand
Dim myAdapter As New MySqlDataAdapter
Dim myData As MySqlDataReader
Dim SQL As String
SQL = "SELECT * FROM `boomtable` WHERE `Tab1` = 'CLOSED'"
myCommand.Connection = conn
myCommand.CommandText = SQL
myAdapter.SelectCommand = myCommand
Try
myData = myCommand.ExecuteReader()
myData.Read()
If myData.HasRows = 0 Then
Label1.Text = "CLOSED"
SQL = "UPDATE boomtable SET Tab1 = 'CLOSED' WHERE Tab1 = 'OPEN'"
myCommand.CommandText = SQL
myCommand.ExecuteNonQuery()
myData.Close()
Else
Label1.Text = "OPEN"
SQL = "UPDATE boomtable SET Tab1 = 'OPEN' WHERE Tab1 = 'CLOSED'"
myCommand.CommandText = SQL
myCommand.ExecuteNonQuery()
myData.Close()
End If
Catch ex As MySqlException
MsgBox(ex.Message)
End Try
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Connect("db4free.net", "boomun", "boom123", "boomdb")
End Sub
End Class
В Try...Catch
-Block поставьте a Finally
-
Ваша попытка повторно использовать объект Connection, который уже открыт. поэтому вам нужно закрыть соединение, а затем снова открыть при повторном запуске следующего запроса.
Try
Catch ex as Exception
'catch Exception'
Finally
conn.Close()
End Try
** ИЗМЕНИТЬ ИЗМЕНЕНИЕ **
Вам нужно отключиться после того, как вы прочтете данные и снова подключитесь для обновления.
Dim myTest As String = "TestString"
. Во-вторых, включитеOption Strict/Infer/Explicit On
. В-третьих, сбросьте уродливое пространство именMicrosoft.VisualBasic
-VB6-Legacy-Name. В-четвертых, чтобы ваши звонки были правильными,MySqlDataReader.HasRows
являетсяBoolean
свойством.