简体   繁体   中英

Connecting to MySQL using VB.NET

I am trying to make a very simple program that connects to a MySQL database using VB.NET. My program only has one form and one label. I setup my MySQL database to have a table and one field (a VARCHAR)

called "Tab1". I manually inserted the value "CLOSED" into the Tab1 field using PHPMyAdmin. I want my program to change the value of the field to OPEN/CLOSED and I also want the label text on my form to

change too when it's clicked.

So far, I've added the MySQL.data reference to my project and added:

Imports System
Imports System.Data
Imports MySql.Data.MySqlClient

To the General_Declarations

Also I declared a global variable containing a MySQL Connection:

Public Class Form1

    Dim conn As New MySqlConnection

Here is my function that connects to 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

I made the program connect to MySQL on Form_Load like this:

Connect("db4free.net", "boomun", "*******", "boomdb")

And it connects fine but here is where I have the trouble.... I want the field to change from CLOSED to OPEN when I click Label1. It does, but it doesn't change back on the second click. Somehow I need a working code to Update the Tab1 field in my table.

Here is what I have so far:

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
                ' *** UPDATE boomtable SET Tab1 = CLOSED WHERE Tab1 = OPEN  ***
                Label1.Text = "CLOSED"
                myData.Close()
            Else
                Label1.Text = "OPEN"
                ' *** UPDATE boomtable SET Tab1 = OPEN WHERE Tab1 = CLOSED ***
                myData.Close()
            End If
        Catch ex As MySqlException
            MsgBox(ex.Message)
        End Try

    End Sub

That UPDATE line isn't working for me... Can anyone please provide a working code? Thanks I really appreciate it!!

Here is the entire code of the project all together:

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
                ' *** UPDATE boomtable SET Tab1 = CLOSED WHERE Tab1 = OPEN  ***
                Label1.Text = "CLOSED"
                myData.Close()
            Else
                Label1.Text = "OPEN"
                ' *** UPDATE boomtable SET Tab1 = OPEN WHERE Tab1 = CLOSED ***
                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 the following statement instead:

UPDATE boomtable SET Tab1 = 'OPEN' WHERE Tab1 = 'CLOSED'

Ofcourse use a ExecuteNonQuery method to execute the statement. If you meant that OPEN and CLOSE are variables, use Parameters for that instead (it's safer).

Like this...

Else
    Label1.Text = "OPEN"
    SQL = "UPDATE boomtable SET Tab1 = 'OPEN' WHERE Tab1 = 'CLOSED'"
    myCommand.CommandText = SQL
    myCommand.ExecuteNonQuery()
    myData.Close()
End If

???

One mistake here is using a global connection object. .Net database connections use a feature called connection pooling, which means most of the time it's really better to create a new connection object for each call out to your database. What you can do is use that global to keep your connection string .

Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click

    Dim SQL As String = "SELECT * FROM `boomtable` WHERE `Tab1` = 'CLOSED'"

    Using rdrCn As New MySqlConnection(connectionString), _
          rdrCmd As New MySqlCommand(SQL, rdrCn)

        rdrCn.Open()

        Using myData As MySqlDataReader = rdrCmd.ExecuteReader()
            SQL = "UPDATE boomtable SET Tab1= @NewState WHERE Tab1 = @OldState"
            Using updCn As New MySqlConnection(connectionString), _
                  updCmd As New MySqlCommand(SQL, updcn)

                updCmd.Parameters.Add("@NewState", MySqlDbType.VarChar, 6)
                updCmd.Parameters.Add("@OldState", MySqlDbType.VarChar, 6)


                If myData.Read()
                    Label1.Text = "CLOSED"
                    updCmd.Parameters(0).Value = "CLOSED"
                    updCmd.Parameters(1).Value = "OPEN"
                Else
                    Label1.Text = "OPEN"
                    Label1.Text = "CLOSED"
                    updCmd.Parameters(0).Value = "OPEN"
                    updCmd.Parameters(1).Value = "CLOSED"
                End If
                updCn.Open()
                upCmd.ExecuteNonQuery()
            End Using
        End Using
    End Using
End Sub

But the bigger question here is why you're going to the database twice at all?

Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
    Dim SQL As String = "UPDATE boomtable SET Tab1 = CASE WHEN Tab1='CLOSED' THEN 'OPEN' ELSE 'CLOSED' END;SELECT Tab1 FROM boomtable LIMIT 1;"

    Using cn As New MySqlConnection(connectionString), _
          cmd As New MySqlCommand(SQL)

       cn.Open()
       Label1.Text = CStr(cmd.ExecuteScalar())
    End Using
End Sub

Now isn't that a whole lot neater?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM