2009-06-05 4 views
0

Dies ist eine einfache Funktion, die TRUE zurückgibt, wenn der Benutzer in der Benutzertabelle existiert, sonst false.Ist etwas mit meiner Logik in diesem ADO.NET-Code? es ist immer falsch zurückgegeben?

Aus irgendeinem Grund ist es immer falsch zurückgegeben, habe ich sogar die WHERE-Klausel entfernt und ich werde immer noch falsch? (Eine manuelle Prüfung in Query Analyzer sagt mir, ich habe viele Zeilen?)

Public Shared Function DoesUserExist(ByVal userID As Integer) As Boolean 

    Dim retValue As Boolean 

    retValue = False 

    Using conn As New SqlConnection(GetConnectionString()) 

     'Dim cmd As SqlCommand = New SqlCommand("SELECT user_ID FROM users WHERE user_ID = @userID", conn) 
     Dim cmd As SqlCommand = New SqlCommand("SELECT user_ID FROM users", conn) 


     cmd.Parameters.Add("@userID", SqlDbType.NVarChar).Value = userID 
     cmd.CommandType = CommandType.Text 

     conn.Open() 

     Dim reader As SqlDataReader = cmd.ExecuteReader() 


     'If Not reader Is Nothing Then 
     ' HttpContext.Current.Response.Write("<br>Null") 
     'End If 

     If reader.Read() Then 

      retValue = True 

     End If 


     conn.Close() 

     cmd.Dispose() 

    End Using 


    retValue = False 



    Return retValue 

End Function 

Antwort

5

Sie RetValue auf false setzen vor dem Verlassen. Das ist das Problem.

Dies ist der richtige Code:

... 

    If reader.Read() Then 

     retValue = True 

    Else 

     retValue = False 

    End If 


    conn.Close() 

    cmd.Dispose() 

End Using 

Return retValue 

.... 
+1

Was ist los, nur zu tun: retValue = reader.Read() – rein

+0

Das ist machbar. Ich weise nur auf den Unterschied zwischen beiden Codes hin. –

2

es die Zeile am Ende sein könnte, die "RetValue" auf false setzt?

2

Das liegt daran, dass Sie retValue auf false setzen, bevor Sie zurückkehren.

Es ist egal, was Sie es auf, bevor - es wird immer durch diese Zeilen am Ende der Funktion falsch sein:

retValue = False 
Return retValue 
+0

ahh .... doh !!!!!!!!!!!!!! 1 –

0

Sie RetValue auf false gesetzt rechts bevor Sie es zurück, und Es gibt keine andere Return-Anweisung in Ihrem Code. Es ist also egal, was vorher passiert. Entferne den letzten retValue = False.

Sie wollen etwas wie folgt aus:

Public Shared Function DoesUserExist(ByVal userID As Integer) As Boolean 

    Dim retValue As Boolean 

    retValue = False 

    Using conn As New SqlConnection(GetConnectionString()) 
     // conditionally set retValue = true, etc. 
    End Using 

    Return retValue 

End Function 
1

Es gibt zwei Probleme im Code.

1: Sie verwenden nicht den Parameter @userID in der Abfrage. Daher gibt es immer alle Benutzer zurück, und der einzige Fall, in dem das Ergebnis leer wäre, ist, wenn überhaupt keine Benutzer vorhanden sind.

Dim cmd As SqlCommand = New SqlCommand("SELECT user_ID FROM users where user_ID = @UserID", conn) 

2: Sie sind die retValue Variable false wieder kurz vor dem return Erklärung abgeben. Daher gibt die Methode immer false zurück, unabhängig vom Ergebnis der Überprüfung des Datenlesers.

Auch sollten Sie Dispose auf dem Datenleser aufrufen.