我是vb.net的新手。我有一个数据库,并且单击搜索按钮并在文本框中显示该信息时,我正在运行员工记录的搜索查询,但是当用户不在数据库中时,搜索输出将显示上一次搜索的信息。如果用户不在记录中,则文本框中的信息应显示为空白或显示“未找到记录”。不知道我的代码有什么问题。
Try
myConnection.Open()
Dim str As String
str = "SELECT * FROM tblEmp WHERE (EmpID = '" & ADS.UserEmpID & "')"
Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
dr = cmd.ExecuteReader
While dr.Read
If dr.HasRows > 0 Then
MessageBox.Show("user already in the system", "Warning", MessageBoxButtons.OK)
ElseIf dr.HasRows = 0 Then
MessageBox.Show("Not Onboarded", "Warning", MessageBoxButtons.OK)
End If
BGC1 = dr("PreStartChecks").ToString
BGC2 = dr("EmpName").ToString
myConnection.Close()
End While
Catch ex As Exception
MsgBox("Unable to Connect to BGC DB. You may not have access or DB not available." &
ex.ToString)
End Try
答案 0 :(得分:0)
您的While
循环和If
语句没有任何意义。首先,HasRows
的类型为Boolean
,因此测试它是否大于零是没有意义的。其次,如果没有行,Read
将返回False
,因此,进入该If
语句的唯一方法是至少有一行要读取,因此测试HasRows
当您已经知道有行也是荒谬的。此处正确的选择是仅使用If
语句并仅测试Read
:
If dr.Read() Then
'There is a row to read and it was just read, so you can now get the data from the reader.
Else
'There is no row to read.
End If
如果要在没有数据时清除控件,请在Else
块中这样做。
关于何时以及如何使用HasRows
和Read
的“规则”非常简单且合乎逻辑:
If
语句来测试HasRows
。 HasRows
属性的类型为Boolean
,因此无需将其与任何内容进行比较。已经是True
或False
。If
语句来调用Read
并测试结果。同样,它的类型为Boolean
,因此无需将其与任何事物进行比较。如果返回True
,则可以访问刚刚读取的行的数据。While
或Do While
循环来调用Read
并访问循环内刚刚读取的行。If
语句来测试HasRows
,然后使用While
或{{1 }}在Do While
块内循环以调用If
。您将处理Read
块中没有行的情况。答案 1 :(得分:0)
假设txtBGC1
和txtBGC2
是TextBoxes,假设查询最多返回一位员工,您可以执行类似的操作
...
If dr.Read Then ' There is an employee
txtBGC1.Text = dr("PreStartChecks").ToString
txtBGC2.Text = dr("EmpName").ToString
Else ' There is no employee
txtBGC1.Text = ""
txtBGC2.Text = "No record found"
End If
myConnection.Close()