每当我点击一个没有注册到数据库的RFID,它就不会显示msgbox。我使用一些使用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发布于 2019-12-03 23:32:34
您是在代码中启用计时器,还是在设计器中将“启用”设置为“真”?你为计时器设定了什么时间间隔?听起来,上面发布的代码是在您能够填充文本框之前运行的。
当我捕获异常时,我使用消息和StackTrace来报告错误。您可能希望替换异常处理程序中的MsgBox文本,以便它对您更有帮助。我愿意打赌,您看到的MsgBox实际上是从Catch块中得到的。
发布于 2019-12-03 16:59:18
我认为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),它将始终返回一个数字,并且实际上从总体上脱离了ADODB,但是上面的内容可能会得到您想要的结果。
编辑
以下是包含特定调试点的完整替代版本。我是一个长期VB的家伙,但我承认我有点生疏,所以你可能需要调整一两件事。
一些非常重要的事情:
,
try/catch。我总是建议保存,直到你有工作的代码,它往往隐藏微小的小错误。当您正在开发一些东西时,例外情况会告诉您首先发生了什么问题,并且您真的很想看到这些问题。MsgBox来显示字符串,而理想情况下,您应该使用控制台,但我这样做是因为这就是您的代码是如何定义为重要的的。不管SQL是什么,都必须在数据库上手动运行,而MsgBox仍然是打开的。这很关键。手动运行它将告诉您是否有语法错误,或者可能存在类型转换问题。使用仍然打开的MsgBox运行它将(更好)保证您没有可能与数据库对话的其他代码的争用条件。如果对数据库手动运行SQL并不能产生您预期的结果,那么修复它,或者在这里发布问题供我们查看,包括任何错误。如果手动运行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发布于 2019-12-04 04:27:10
首先,为什么要使用一个有十年历史的开发工具。VisualStudio2019社区免费下载。
完全摆脱Timer,只需使用登录按钮即可。
让我们进入当前的十年,使用ADO.net而不是ADODB。
由于我不知道您使用的是哪个数据库,所以我给出了一个使用Server的示例。如果数据库是Access的,则必须将Sql数据库对象更改为OleDb对象。在文件顶部导入以下内容之一。
Imports System.Data.SqlClient或
Imports System.Data.OleDb数据库对象需要关闭和处理。即使有错误,Using...End Using块也会为您处理这个问题。您可以将连接字符串直接传递给连接的构造函数,命令文本和连接直接传递给命令的构造函数。注意,它们都包含在同一个使用块中。
当你只需要数数的时候,不要拉下数据。只需要数一数。永远不要连接字符串来构建Sql查询。始终使用参数以避免Sql注入。
我不得不猜测rfid的数据类型。检查数据库的实际类型,并相应地调整代码。
如果结果集为.ExecuteScalar,则返回第一行,第一列。在这种情况下,记录计数。
请注意,连接直到.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 Subhttps://stackoverflow.com/questions/59161637
复制相似问题