我使用以下代码连接到Access数据库,并检查用户的名称是否已添加到表中,如果是,则根据其所属的表直接影响其访问级别到软件。
Public Sub Check_Database_For_Access_Level(Name As String)
Dim myCon = New OleDbConnection(My.Settings.Database_Connection_String)
myCon.Open()
Dim dr As OleDbDataReader
Dim Str
Str = "SELECT * FROM [Admin] WHERE [Emp Name]=?"
Dim cmd As OleDbCommand = New OleDbCommand(Str, myCon)
cmd.Parameters.AddWithValue("Emp Name", Name)
dr = cmd.ExecuteReader
dr.Read()
If dr("Emp Name").ToString = Name Then 'ERROR HERE
My.Settings.Setting_AccessLevel = "Administrator"
Else
Str = "SELECT * FROM [ReadWrite] WHERE [Emp Name]=?"
cmd.Parameters.AddWithValue("Emp Name", Name)
dr = cmd.ExecuteReader
dr.Read()
If dr("Emp Name").ToString = Name Then
My.Settings.Setting_AccessLevel = "Read And Write"
Else
End If
End If
myCon.Close()
End Sub
该行:
If dr("Emp Name").ToString = Name Then 'ERROR HERE
如果结果为真,应该运行,但如果结果为假,那么sub就会退出?
怎么没有解雇Else
部分?即使单步退出它也会退出。
答案 0 :(得分:2)
SELECT COUNT(*) FROM...
并使用ExecuteScalar
会更容易,因为几乎可以保证返回值。您对第二个表格的预期检查不起作用,因为您尚未更改.CommandText
:
Using myCon As New OleDbConnection(My.Settings.Database_Connection_String)
myCon.Open()
Dim sql = "SELECT COUNT(*) FROM [Admin] WHERE [Emp Name]=?"
Using cmd As New OleDbCommand(sql, myCon)
cmd.Parameters.AddWithValue("Emp Name", name)
Dim n = CInt(cmd.ExecuteScalar())
If n = 1 Then
My.Settings.Setting_AccessLevel = "Administrator"
Else
cmd.CommandText = "SELECT COUNT(*) FROM [ReadWrite] WHERE [Emp Name]=?"
n = CInt(cmd.ExecuteScalar())
If n = 1 Then
My.Settings.Setting_AccessLevel = "Read And Write"
Else
' no such user OR more than one user with the same name
End If
End If
End Using
End Using
答案 1 :(得分:1)
您的SQL语句包含一个WHERE子句,该子句已检查数据库中是否存在作为参数传递的名称。所以你真的不需要再次检查那个条件。您可以简单地计算该名称中存在的记录数量,并使用更简单的ExecuteScalar来查明您是否至少有一个具有该名称的记录
Str = "SELECT COUNT(*) FROM [Admin] WHERE [Emp Name]=?"
Dim cmd As OleDbCommand = New OleDbCommand(Str, myCon)
cmd.Parameters.AddWithValue("Emp Name", Name)
dim result = Convert.ToInt32(cmd.ExecuteScalar)
if result > 0 Then
' You have the Admin with that name
else
' Check the other table
End If
另请注意,执行COUNT通常被认为是完成此工作的不良方法,但我很确定Access不支持SQL Server和其他数据库系统中提供的更高级技术(IF EXISTS .... )