VB2013和MySQL不能正常对话和程序冻结

VB2013和MySQL不能正常对话和程序冻结,mysql,vb.net,visual-studio-2013,serial-port,arduino,Mysql,Vb.net,Visual Studio 2013,Serial Port,Arduino,我已经在一个小项目上工作了一段时间了-它需要从Ardiuno板上输入一个纯文本简单文本,只有几个字符。这是一个简单的NFC卡标签程序。程序应该从SerialPort获取输入,并根据MySQL数据库检查输入文本。如果它在数据库中找到名称,那么它将更新一列,就是它 问题有两个方面:首先,虽然我可以查询数据库并获得数据库中的人员列表,但无论向数据库传递什么输入,程序的标记端都不会更新数据库。第二,每当程序接收到任何输入时,程序就会锁定,GUI就会失去响应 下面是我的代码,我很乐意回答任何问题、评论或批

我已经在一个小项目上工作了一段时间了-它需要从Ardiuno板上输入一个纯文本简单文本,只有几个字符。这是一个简单的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

你犯了什么错误?没什么-这是最糟糕的部分。程序不更新数据库,然后冻结/锁定。这可能与循环引用有关吗?程序确实会在Subs上移动一点。如果你连接了调试器,你能设置任何断点并尝试找出它似乎被卡住的地方吗?还有,你的计时器的时间间隔是多少?我的计时器设置为500,所以每半秒滴答一次。我现在将尝试连接调试器,然后查看。你建议把断点放在哪里?好的,所以我试着设置断点,但是当程序锁定时,断点没有显示任何内容。所以-要么我用错了点,要么这个程序真的那么糟糕。。。