如何解析登录表单中的 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 的人,但我承认我有点生疏,所以你可能需要调整一两件事。
一些非常重要的事情:
我删除了 try/catch
。我总是建议保存它,直到你有工作代码,它往往会隐藏微小的小错误。当您正在开发某些东西时,异常会首先告诉您哪里出了问题,而您真的很想看到它们。
我使用 MsgBox
来显示字符串,理想情况下您会使用控制台,但我这样做是因为您的代码就是这样编写的。
最重要。无论被踢出的 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
每当我点击一个未注册到数据库的 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 的人,但我承认我有点生疏,所以你可能需要调整一两件事。
一些非常重要的事情:
我删除了
try/catch
。我总是建议保存它,直到你有工作代码,它往往会隐藏微小的小错误。当您正在开发某些东西时,异常会首先告诉您哪里出了问题,而您真的很想看到它们。我使用
MsgBox
来显示字符串,理想情况下您会使用控制台,但我这样做是因为您的代码就是这样编写的。最重要。无论被踢出的 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