VB.Net代码在false if语句中退出例程而不执行' Else'命令

时间:2015-12-21 11:03:49

标签: vb.net if-statement

我使用以下代码连接到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部分?即使单步退出它也会退出。

2 个答案:

答案 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 .... )