如何解析登录表单中的 if 语句

How to resolve if statements in login forms

每当我点击一个未注册到数据库的 RFID 时,它不会显示消息框。我使用了一些使用 else 的条件语句,但它也不起作用。我尝试了不等于运算符,但也没有用

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    process1:
    Try

        rec = New ADODB.Recordset
        rec.Open("SELECT * from admin where rfid='" & TextBox4.Text & "'", con, 1, 2)

        Dim y As Integer
        y = 0

        While Not rec.EOF

            rec.MoveNext()
            y = y + 1

        End While

        If y = 1 Then
                Timer1.Stop()
                Me.Hide()
                MsgBox("VALID RFID! WELCOME ADMIN!")
                SystemForm.Show()
                TextBox4.Text = ""

            If y <> 1 Then

                Timer1.Stop()
                MsgBox("Invalid RFID NO.!")
                TextBox4.Text = ""

            End If

        End If


    Catch ex As Exception
        Timer1.Stop()
        MsgBox("Invalid RFID NO.!")
        TextBox4.Text = ""
    End Try

End Sub

我认为 else 最适合您。我还将一些共享逻辑移出了条件:

Timer1.Stop()

If y = 1 Then
    Me.Hide()
    MsgBox("VALID RFID! WELCOME ADMIN!")
    SystemForm.Show()
Else
    Timer1.Stop()
    MsgBox("Invalid RFID NO.!")
End If

TextBox4.Text = ""

我还会在长 运行 中做很多其他更改,包括使用 SELECT COUNT(rfid) 进行查询,它总是 return 一个数字,实际上总体上远离 ADODB,但以上内容应该可以满足您的需求。

编辑

这是一个包含特定调试点的完整替代版本。我是一个长期 VB 的人,但我承认我有点生疏,所以你可能需要调整一两件事。

一些非常重要的事情:

  1. 我删除了 try/catch。我总是建议保存它,直到你有工作代码,它往往会隐藏微小的小错误。当您正在开发某些东西时,异常会首先告诉您哪里出了问题,而您真的很想看到它们。

  2. 我使用 MsgBox 来显示字符串,理想情况下您会使用控制台,但我这样做是因为您的代码就是这样编写的。

  3. 最重要。无论被踢出的 SQL 是什么,您都必须在 MsgBox 仍处于打开状态时 运行 针对您的数据库 手动 。这很关键。 运行 它会手动告诉您是否有语法错误,或者可能存在类型转换问题。 运行 在 MsgBox 仍然打开的情况下,它会(更好地)保证您不会与可能正在与数据库对话的其他代码发生竞争条件。如果 运行 对您的数据库手动 SQL 没有产生您期望的结果,请修复它或 post 这里的问题供我们查看,包括任何错误。如果 运行 手动 SQL 有效但代码无效,请检查您的连接对象,也许您正在与其他数据库对话?

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    Timer1.Stop()

    ' First lets find out what is in the text box
    MsgBox("Searching for rfid: " & TextBox4.Text)

    ' Next, lets take a look at the SQL
    sql = "SELECT * from admin where rfid='" & TextBox4.Text & "'"
    MsgBox("Using SQL: " & sql)

    rec = New ADODB.Recordset
    rec.Open(sql, con, 1, 2)

    Dim y As Integer
    y = 0

    While Not rec.EOF
        rec.MoveNext()
        y = y + 1
    End While

    Timer1.Stop()

    If y = 1 Then
        Me.Hide()
        MsgBox("VALID RFID! WELCOME ADMIN!")
        SystemForm.Show()
    Else
        MsgBox("Invalid RFID NO.!")
    End If

    TextBox4.Text = ""

End Sub

您是在代码中启用计时器还是在设计器中将 Enabled 设置为 True?你为计时器设置了什么时间间隔?听起来上面发布的代码是 运行 在您能够填充文本框之前。

当我捕获异常时,我使用 Message 和 StackTrace 进行错误报告。您可能想要替换异常处理程序中的 MsgBox 文本,以便它为您提供更多信息。我敢打赌,您看到的 MsgBox 实际上来自 Catch 块。

首先,为什么要使用十年前的开发工具。 Visual Studio 2019 社区免费下载。

完全摆脱 Timer,只使用登录按钮。

让我们进入当前十年并使用 ADO.net 而不是 ADODB

因为我不知道你使用的是什么数据库,所以我举了一个使用 Sql 服务器的例子。如果数据库是 Access,那么您必须将 Sql 数据库对象更改为 OleDb 对象。在文件顶部导入以下内容之一。

Imports System.Data.SqlClient

Imports System.Data.OleDb

需要关闭和处置数据库对象。 Using...End Using 块会为您处理此问题,即使出现错误也是如此。您可以将连接字符串直接传递给连接的构造函数,将命令文本和连接直接传递给命令的构造函数。请注意,它们都包含在同一个 Using 块中。

当您只需要计数时,不要下拉数据。只问计数。永远不要连接字符串来构建 Sql 查询。始终使用参数来避免 Sql 注入。

我不得不猜测 rfid 的数据类型。检查您的数据库以了解实际类型并相应地调整代码。

.ExecuteScalar returns第一行第一列如果是结果集。在这种情况下,记录计数。

请注意,直到 .Execute... 之前才打开连接。它在 End Using 之后立即关闭。在连接关闭之前,我们不会开始比较结果并显示消息框。

如果您尝试此代码但它不起作用,请告诉我们错误是什么以及它发生在哪一行。

Private Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Tick
    Dim RetVal As Integer
    Using cn As New SqlConnection("Your connection string"),
            cmd As New SqlCommand("Select Count(*) Form admin Where rfid = @rfid;", cn)
        cmd.Parameters.Add("@rfid", SqlDbType.Int).Value = CInt(TextBox4.Text)
        cn.Open()
        RetVal = CInt(cmd.ExecuteScalar)
    End Using
    If RetVal = 1 Then
        MsgBox("VALID RFID! WELCOME ADMIN!")
        SystemForm.Show()
        Me.Hide()
    Else
        MsgBox("Invalid RFID NO.!")
    End If
    TextBox4.Text = ""
End Sub