2011-02-26 89 views
1

我想做一个非常简单的程序,使用VB.NET连接到MySQL数据库。我的程序只有一个表单和一个标签。我设置我的MySQL数据库,使其具有一个表格和一个名为“Tab1”的字段(一个VARCHAR)使用VB.NET连接到MySQL

。我使用PHPMyAdmin手动将值“CLOSED”插入到Tab1字段中。我希望我的程序将字段的值更改为“打开/关闭”,并且我还希望我的表单上的标签文本可以在点击时更改为

到目前为止,我已经添加了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。它的确如此,但它在第二次点击时不会改变。不知何故,我需要一个工作代码来更新我的表中的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 

该更新行不为我工作...任何人都可以请提供一个工作代码?谢谢,我真的很感激它!

这里是整个项目的代码都在一起:

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 
+0

你是怎么叫'UPDATE'语句的?看起来你只是在评论中有一个sql语句... – mellamokb 2011-02-26 22:57:33

+0

它只是一个评论,因为它不工作....我问我应该做什么,而是..这就是我的问题。 – BooMGiRL 2011-02-27 00:10:44

回答

0

试试下面的语句来代替:

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

Ofcourse使用ExecuteNonQuery方法执行该语句。如果你的意思是OPEN和CLOSE是变量,那么改用它的参数(更安全)。

+0

如何ExecuteNonQuery方法执行语句?对不起,仍然在学习 – BooMGiRL 2011-02-27 03:26:28

+0

像这样:command.ExecuteNonQuery() – Goows 2011-02-27 04:05:25

+0

我在哪里把command.ExecuteNonQuery()? – BooMGiRL 2011-02-27 05:52:58

0

就像这个...

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

???

+0

是的,加上括号。 SQL =“UPDATE boomtable set tab1 ='OPEN'WHERE tab1 ='CLOSED'” – tiago2014 2011-02-27 06:32:43

+0

VB给了我一个错误,并且突出显示SQL.ExecuteNonQuery()说'ExecuteNonQuery'不是'String'的成员。 – BooMGiRL 2011-02-27 07:38:52

+0

立即尝试。这应该执行,但它不会是最好的方式。 – 2011-02-27 12:37:11

0

这里的一个错误是使用全局连接对象。 .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 

现在是不是很多整洁?