VB2013& MySQL没有正确说话和程序冻结

时间:2014-10-21 11:01:39

标签: mysql vb.net visual-studio-2013 serial-port arduino

我一直在做一个小项目 - 它需要从Ardiuno Board输入纯文本(简单文本,只有几个字符)。这是一个简单的NFC卡标记程序。该程序应该从SerialPort获取输入并检查MySQL数据库的输入文本。如果它在数据库中找到了名称,那么它就是更新一列,即它。

问题有两个 - 首先,当我可以查询数据库并获取数据库中的人员列表时,程序的标记端将不会更新数据库,无论输入什么输入。其次 - 只要程序收到任何输入,程序就会锁定,GUI就会无法响应。

我的代码如下,我很高兴任何问题,评论或批评。是的,MySQL服务器在端口' 8228'上。这段代码让我发疯,我道歉,因为它可能看起来很乱......

Imports System.IO.Ports
Imports System.Threading
Imports System.Text
Imports System.Data.Odbc

Public Class Form1
    Dim WithEvents SerialPort As New IO.Ports.SerialPort
    Dim ListStr As String
    Dim SQLString As String
    Dim fstoday As String = Today.Day.ToString + "_" + Today.Month.ToString + "_" + Today.Year.ToString
    Dim NextLine As String
    Dim PortNum As String
    Dim SqlConn As String
    Dim sw As StreamWriter

    Private Sub Form1_Load(sender As Object, e As EventArgs)
        Timer1.Start()
        SerialPort.ReceivedBytesThreshold = 4
        PortNum = "COM6"
        SqlConn = "mydomain.local"
        Call TestSQLConnectionToolStripMenuItem_Click()
        Call ConnectSerial()
        'create todays log file 
        Dim filesys As New FileStream("c:\TagLog\Log-" + fstoday + ".txt", FileMode.Append, FileAccess.Write, FileShare.Write)
        filesys.Close()
    End Sub

    Private Sub ConnectSerial()
        'set the USB (COM) Port and Bandwidth (BaudRate)
        Try
            SerialPort.BaudRate = 115200
            SerialPort.PortName = PortNum
            SerialPort.Open()
            LabPort.Text = "Reader OK"
            LabPort.ForeColor = Color.Green
        Catch
            SerialPort.Close()
            LabPort.Text = "Reader Not Found"
            LabPort.ForeColor = Color.Red
        End Try
    End Sub

    'This handles setting and reading from the serial port
    Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
        Dim str As String = SerialPort.ReadExisting()
        Invoke(myD1, str)
    End Sub

    'This makes the serial input into String format 
    Delegate Sub myMethodDelegate(ByVal [text] As String)
    Dim myD1 As New myMethodDelegate(AddressOf myShowStringMethod)

    Sub myShowStringMethod(ByVal myString As String)
        ListStr = ""
        SQLString = ""
        'display text to our textbox
        TextBox2.AppendText(myString)
        'Add the last input to the listbox
        ListBox1.Items.Add(TextBox2.Text)
        ListStr = ListBox1.Items(ListBox1.Items.Count - 1)
        SQLString = "Select * From TagTable where QuickName='" + myString + "';"
        Try
            Dim cn As OdbcConnection = New OdbcConnection("driver={MySQL ODBC 5.3 Unicode Driver};server=" + SqlConn + ";port=8228;database=tagging;uid=TagUser;pwd=tagging;")
            cn.Open()
            Dim cmd As New OdbcCommand(SQLString, cn)
            SQLString = "UPDATE tagtable SET State = NOT State, Time=Now() WHERE QuickName='" + myString + "';"
            sw.WriteLine(vbCr + Now() + " " + myString)
            Call UpdateSQL()
            cn.Close()
        Catch ex As Exception
            sw.WriteLine(vbCr + Now() + ex.ToString)
        End Try
        sw.Close()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        'Once per Tick, check what the COM port is saying.
        If SerialPort.IsOpen Then
            TextBox2.Text = ""
        Else
            TextBox2.Text = ""
            Call ConnectSerial()
        End If
    End Sub

    Private Function IIf(fileExists As Boolean, p2 As String) As Object
        Throw New NotImplementedException
    End Function

    Private Sub UpdateSQL()
        Dim cn As OdbcConnection = New OdbcConnection("driver={MySQL ODBC 5.3 Unicode Driver};server=" + SqlConn + ";port=8228;database=tagging;uid=TagUser;pwd=tagging;")
        'check connection to the SQL Server and update the records
        Dim cmd As OdbcCommand = New OdbcCommand(SQLString, cn)
        cn.Open()
        LabSQL.ForeColor = Color.Green
        LabSQL.Text = "SQL OK"
        If SQLString <> "" Then
            Try
                cmd.ExecuteNonQuery()
                cn.Close()
                LabSQL.ForeColor = Color.Green
            Catch ex As Exception
                LabSQL.ForeColor = Color.Red
                LabSQL.Text = "SQL Not OK"
                sw.WriteLine(vbCr + Now() + " " + ex.ToString)
                cn.Close()
            End Try
        Else
            cn.Open()
            LabSQL.ForeColor = Color.Green
        End If
            'If there is a problem, change Sql Label, and clsoe the error'd connection.
        cn.Close()
        SQLString = ""
    End Sub

    Private Sub TestSQLConnectionToolStripMenuItem_Click() Handles TestSQLConnectionToolStripMenuItem.Click
        Dim cn As OdbcConnection
        cn = New OdbcConnection("driver={MySQL ODBC 5.3 Unicode Driver};server=" + SqlConn + ";port=8228;database=tagging;uid=TagUser;pwd=tagging;")
        'check connection to the SQL Server
        Try
            cn.Open()
            LabSQL.ForeColor = Color.Green
            LabSQL.Text = "SQL OK"
            cn.Close()
            'If there is a problem, change Sql Label, display the error in a message box and Close the error'd connection.
        Catch ex As OdbcException
            LabSQL.ForeColor = Color.Red
            LabSQL.Text = "SQL Not OK"
            cn.Close()
        End Try
    End Sub

    Private Sub ExitToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExitToolStripMenuItem.Click
        Dim msgans As String
        msgans = MsgBox("Are you sure you want to exit?", MsgBoxStyle.YesNo, "Exit?")
        If msgans = vbYes Then
            SerialPort.Close()
            Me.Close()
        End If
    End Sub

    Private Sub ToolStripMenuItem3_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem3.Click
        PortNum = "COM1"
        Call ConnectSerial()
    End Sub

    Private Sub ToolStripMenuItem4_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem4.Click
        PortNum = "COM2"
        Call ConnectSerial()
    End Sub

    Private Sub ToolStripMenuItem5_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem5.Click
        PortNum = "COM3"
        Call ConnectSerial()
    End Sub

    Private Sub ToolStripMenuItem6_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem6.Click
        PortNum = "COM4"
        Call ConnectSerial()
    End Sub

    Private Sub ToolStripMenuItem7_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem7.Click
        PortNum = "COM5"
        Call ConnectSerial()
    End Sub

    Private Sub ToolStripMenuItem8_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem8.Click
        PortNum = "COM6"
        Call ConnectSerial()
    End Sub

    Private Sub AboutToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AboutToolStripMenuItem.Click
        MsgBox("Made by Phill C at Epoq IT. Tag Control V2.3")
    End Sub

    Private Sub LocalMachineToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles LocalMachineToolStripMenuItem.Click
        SqlConn = "localhost"
        Call TestSQLConnectionToolStripMenuItem_Click()
    End Sub

    Private Sub OtherLocationToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OtherLocationToolStripMenuItem.Click
        SqlConn = InputBox("Enter the SQL Address or Location.", "SQL Location Input", "localhost").ToString
        Call TestSQLConnectionToolStripMenuItem_Click()
    End Sub

    Private Sub ShowUserListToolStripMenuItem_Click() Handles ShowUserListToolStripMenuItem.Click
        Dim cn As OdbcConnection
        Dim Outstring As String = ""
        SQLString = "Select Person,Quickname from TagTable"
        cn = New OdbcConnection("driver={MySQL ODBC 5.3 Unicode Driver};server=" + SqlConn + ";port=8228;database=tagging;uid=TagUser;pwd=tagging;")
        cn.Open()
        Dim cmd As New OdbcCommand(SQLString, cn)
        Dim Query = cmd.ExecuteReader()
        Outstring = "FULL NAME, QUICK NAME" + vbCr
        While Query.Read
            Outstring = Outstring + Query.Item(0) + " , " + Query.Item(1) + vbCr
        End While
        MsgBox(Outstring)
        Query.Close()
        cn.Close()
    End Sub

    Private Sub AddUserToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AddUserToolStripMenuItem.Click
        Dim QueryFull = InputBox("Enter the New Users Full Name.", "New User Input", "New User").ToString
        Dim QueryQName = InputBox("Enter the New Users Quick Name / Nickname.", "New User Input", "New User").ToString
        SQLString = "Insert Into TagTable (QuickName,Person,State,Time) Values ('" + QueryQName + "','" + QueryFull + "','In', NOW());"
        Dim cn As OdbcConnection
        cn = New OdbcConnection("driver={MySQL ODBC 5.3 Unicode Driver};server=" + SqlConn + ";port=8228;database=tagging;uid=TagUser;pwd=tagging;")
        cn.Open()
        Try
            Dim cmd As New OdbcCommand(SQLString, cn)
            MsgBox("New User has been setup on the Server.")
            cn.Close()
        Catch ex As Exception
            cn.Close()
            MsgBox("New User setup has failed, please contact IT Support")
        End Try
    End Sub

    Private Sub DeleteUserToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DeleteUserToolStripMenuItem.Click
        Dim QueryFull = InputBox("Enter the Users Full Name.", "Delete User Input", "User To be deleted").ToString
        Dim QueryQName = InputBox("Enter the Users Quick Name / Nickname.", "Delete User Input", "User To be deleted").ToString
        SQLString = "Delete From TagTable Where QuickName='" + QueryQName + "' AND Person='" + QueryFull + "';"
        Dim cn As OdbcConnection
        cn = New OdbcConnection("driver={MySQL ODBC 5.3 Unicode Driver};server=" + SqlConn + ";port=8228;database=tagging;uid=TagUser;pwd=tagging;")
        cn.Open()
        Try
            Dim cmd As New OdbcCommand(SQLString, cn)
            MsgBox("User has been removed from the Server.")
            cn.Close()
        Catch ex As Exception
            cn.Close()
            MsgBox("User revomal has failed, please check the full name and quick names, and try again.")
        End Try
    End Sub
End Class

0 个答案:

没有答案