【问题标题】:Connecting to MySQL using VB.NET使用 VB.NET 连接到 MySQL
【发布时间】:2011-02-26 22:53:36
【问题描述】:

我正在尝试制作一个使用 VB.NET 连接到 MySQL 数据库的非常简单的程序。我的程序只有一个表格和一个标签。我将我的 MySQL 数据库设置为有一个表和一个字段(一个 VARCHAR)

称为“Tab1”。我使用 PHPMyAdmin 将值“CLOSED”手动插入到 Tab1 字段中。我希望我的程序将字段的值更改为 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

我让程序在 Form_Load 上连接到 MySQL,如下所示:

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

它连接得很好,但这是我遇到问题的地方......我希望当我单击 Label1 时该字段从 CLOSED 更改为 OPEN。确实如此,但它不会在第二次单击时变回来。不知何故,我需要一个工作代码来更新表中的 Tab1 字段。

这是我目前所拥有的:

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

那条 UPDATE 行对我不起作用...谁能提供一个工作代码?谢谢我真的很感激!

以下是项目的全部代码:

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

【问题讨论】:

  • 您如何“调用”UPDATE 声明?看起来你只是在评论中有一条 sql 语句......
  • 它只是一个评论,因为它不起作用....我问的是我应该做什么..这就是我遇到的问题。

标签: .net mysql vb.net


【解决方案1】:

请尝试以下语句:

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

当然使用 ExecuteNonQuery 方法来执行语句。如果您的意思是 OPEN 和 CLOSE 是变量,请改用参数(这样更安全)。

【讨论】:

  • 如何使用ExecuteNonQuery方法来执行语句??抱歉还在学习
【解决方案2】:

像这样……

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

???

【讨论】:

  • 是的,加上括号。 SQL = " UPDATE boomtable SET Tab1 = 'OPEN' WHERE Tab1 = 'CLOSED' "
  • VB 给我一个错误并突出显示 SQL.ExecuteNonQuery() 说 'ExecuteNonQuery' 不是 'String' 的成员。
  • 立即尝试。这应该执行,但这不是最好的方法。
  • 谢谢C.罗斯!!!!它确实执行了...但是现在单击标签时出现 MySQL 错误..“已经有一个打开的 DataReader 与此连接关联,必须先关闭”
【解决方案3】:

这里的一个错误是使用全局连接对象。 .Net 数据库连接使用称为连接池的功能,这意味着大多数情况下,最好为每次调用数据库创建一个新的连接对象。您可以做的是使用该全局来保持您的连接字符串

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

但这里更大的问题是你为什么要访问数据库两次?

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

现在不是更整洁了吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    相关资源
    最近更新 更多