2011-02-26 92 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 

現在是不是很多整潔?