2014-12-19 95 views
1

我得到錯誤我在哪裏錯過了這個VB.NET函數中的'Return'語句?

函數'Login'不會在所有代碼路徑上返回一個值。你是否錯過了'Return'聲明?

我在某種程度上瞭解Stack的各種問題 溢出。我的困惑是,我對所有代碼路徑都有返回值 - 是嗎?

Public Function Login(Username As String, Password As Integer) As Integer 

    Dim tableAdapter As New AcquisitionPortalDataSetTableAdapters.ITVF_LoginLogoutTableAdapter 
    Dim dt As DataTable = tableAdapter.GetData(Username, Convert.ToInt32(Password)) 

    Try 
     If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then 
      For Each dr In dt.Rows 
       If dr("LAN").ToString = Username AndAlso Convert.ToInt32(dr("Code")) = Password Then 
        GlobalVariables.iUserType = Convert.ToInt32(dr("Code")) 
        GlobalVariables.iUserID = Convert.ToInt32(dr("ID")) 
        Return 1 
       Else 
        Return 0 
       End If 
      Next 
     Else 
      Return 0 
     End If 
    Catch 
     Return 0 
    End Try 

End Function 

我已經過了很多次,每一個陳述都可以被評估,據我所知。任何人都可以提出其他建議,如果可能,最好有一個簡短的解釋,所以我明白未來?

+1

將'登錄= 0'放在函數的第一行。 – 2014-12-19 11:13:12

+0

是的,這工作,謝謝。 – d3m0n1cd4rkn355 2014-12-19 11:15:15

+0

這很好,但我也在等待一個合理的解釋。 – 2014-12-19 11:21:18

回答

5

這是因爲編譯器不知道您正在檢查表是否有行,因此假定您的代碼路徑不能輸入For Each循環。事實上,沒有必要首先檢查行數,因爲如果在其中沒有行,則For Each循環將具有零迭代。

要解決,你需要明確覆蓋不測警告:

Public Function Login(Username As String, Password As Integer) As Integer 

    Dim tableAdapter As New AcquisitionPortalDataSetTableAdapters.ITVF_LoginLogoutTableAdapter 
    Dim dt As DataTable = tableAdapter.GetData(Username, Convert.ToInt32(Password)) 

    Try 
     If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then 
      For Each dr In dt.Rows 
       If dr("LAN").ToString = Username AndAlso Convert.ToInt32(dr("Code")) = Password Then 
        GlobalVariables.iUserType = Convert.ToInt32(dr("Code")) 
        GlobalVariables.iUserID = Convert.ToInt32(dr("ID")) 
        Return 1 
       Else 
        Return 0 
       End If 
      Next 
      Return 0 'return here when there are no rows in the datatable 
     Else 
      Return 0 
     End If 
    Catch 
     Return 0 
    End Try 

End Function 

說了這麼多,你的功能可以進行簡單(快速),如果你的用戶名是獨一無二的,因爲如果你發現你不」的usernme不必再檢查:

Public Function Login(Username As String, Password As Integer) As Integer 

    Dim tableAdapter As New AcquisitionPortalDataSetTableAdapters.ITVF_LoginLogoutTableAdapter 
    Dim dt As DataTable = tableAdapter.GetData(Username, Convert.ToInt32(Password)) 
    If dt Is Nothing Then Return 0 

    For Each dr As DataRow In dt.Rows 
     If dr.Field(Of String)("LAN") = Username Then 
      'we found the username now check the password 
      Return If(dr.Field(Of Int32)("Code") = Password, 1, 0) 
     End If 
    Next 

    'we didn't find a matching username 
    Return 0 

End Function 
+0

這非常有道理,非常感謝你馬特。 – d3m0n1cd4rkn355 2014-12-19 14:14:54

-1

難道你不能只在End Try後面放一個return語句嗎?並在保存結果的函數的開始做一個變量?在函數結束時,只需返回該結果即可。

我對VB.NET並不熟悉,但這應該可以做到。