Обновление MySQL Field в VB.NET Ошибка

0

Я пытаюсь создать очень простую программу, которая подключается к базе данных 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
  • 1
    Несколько советов для VB.NET: во-первых, вы можете напрямую присваивать значения переменным: Dim myTest As String = "TestString" . Во-вторых, включите Option Strict/Infer/Explicit On . В-третьих, сбросьте уродливое пространство имен Microsoft.VisualBasic -VB6-Legacy-Name. В-четвертых, чтобы ваши звонки были правильными, MySqlDataReader.HasRows является Boolean свойством.
Теги:

1 ответ

0

В Try...Catch -Block поставьте a Finally -

Ваша попытка повторно использовать объект Connection, который уже открыт. поэтому вам нужно закрыть соединение, а затем снова открыть при повторном запуске следующего запроса.

Try

Catch ex as Exception
    'catch Exception'
Finally
    conn.Close()
End Try

** ИЗМЕНИТЬ ИЗМЕНЕНИЕ **

Вам нужно отключиться после того, как вы прочтете данные и снова подключитесь для обновления.

  • 0
    Я не вижу, какое редактирование вы сделали, оно выглядит одинаково для меня? Я попробовал это и все еще получаю ту же ошибку.
  • 0
    Это была правка: «Вам нужно отключиться после того, как вы прочитали данные, и снова подключиться, чтобы выполнить обновление».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню