2015-12-21 64 views
0

我使用以下代碼連接到Access數據庫,並檢查用戶的名稱是否添加到表中,如果它們是,則根據他們屬於哪個表直接影響他們對軟件的訪問級別。VB.Net代碼退出例程,如果沒有執行'Else'命令,如果語句

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 

工作,因爲它應該是,如果結果爲真,但如果是假的,子乾脆退出?

它怎麼沒有發射Else部分?即使通過它只是退出。

+0

有一個例外是在這裏悄然吞噬(我的猜測是你的方法被從你的主窗體的'Load'事件調用處理程序或類似的)。將'Try/Catch'放在'Check_Database_For_Access_Level'的調用中,看看它是什麼。 –

+0

也許它是拋出一個異常 - 可能是'NullReferenceException',因爲我猜如果用戶不在管理表中,dr(「Emp Name」)'將爲空,這意味着你不能調用' .ToString'就可以了,所以錯誤。試試'如果dr(「Emp Name」)IsNot Nothing AndAlso dr(「Emp Name」)。ToString()= Name Then' –

+0

'myCon.Close()'應該放在finally塊中 –

回答

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

您的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 ....)

+0

謝謝,甚至沒有想到我已經檢查了存在的名稱 – SilverShotBee