2015-10-27 1 views
0

J'ai la fonction suivante qui obtient une série de KVP à partir d'une base de données et maintenant je veux écrire une fonction qui prendra une valeur entière comme argument et retourner la correspondance Valeur de chaîne. Quelle est la meilleure façon de le faire s'il vous plaît?Une fonction pour retourner juste la valeur d'un KeyValuePair

Private Function GetReasons() As List(Of KeyValuePair(Of Integer, String)) 
    Dim returnValue As New List(Of KeyValuePair(Of Integer, String)) 
    Dim con As New SqlConnection(SCRGlobals.ConnectionString) 
    Dim cmd As New SqlCommand("SELECT CODE, DESC FROM ltblDELAY", con) 
    cmd.CommandType = CommandType.Text 
    Try 
     con.Open() 
     Dim c As SqlDataReader = cmd.ExecuteReader() 
     While c.Read 
      returnValue.Add(New KeyValuePair(Of Integer, String)(c("CODE"), c("DESC"))) 
     End While 
    Catch ex As Exception 
     Common.LogError(ex, True, False) 
    Finally 
     If con.State <> ConnectionState.Closed Then 
      con.Close() 
     End If 
    End Try 
    Return returnValue 
End Function 
+0

En général, vous devez régler [ 'OPTION STRICT'] (https://msdn.microsoft .com/fr-us/library/zcd4xwzs.aspx) à 'On'. –

+0

Utilisez un [dictionnaire] (https://msdn.microsoft.com/fr-fr/library/xfhwa508 (v = vs.110) .aspx) au lieu d'une liste. –

Répondre

1

Pas besoin d'écrire votre propre fonction.

Dim l As List(Of KeyValuePair(Of Integer, String)) 
l = GetReasons() 
Dim intKey as Integer = 1 '<-- whatever value you want to look up. 
'This is your function... 
Dim strValue as String = l.ToDictionary(Function(x) x.Key).Item(intKey).Value 

En fait, vous pouvez envelopper dans votre propre fonction (et le rendre plus robuste):

Private Function GetValue(l As List(Of KeyValuePair(Of Integer, String)), key As Integer) 
    Dim d As Dictionary(Of Integer, KeyValuePair(Of Integer, String)) = l.ToDictionary(Function(x) x.Key) 
    If d.ContainsKey(key) Then 
     Return d.Item(key).Value 
    Else 
     'Default value or error message 
    End If 
End Function 
+0

Quelle est la valeur intKey? –

+0

C'est l'argument de la valeur entière que vous vouliez pour votre fonction. – Fruitbat

0

Vous devriez passer comme filtre paramètre à la base de données: WHERE [email protected]:

Private Function GetReasons(code As Int32) As List(Of KeyValuePair(Of Integer, String)) 
    Dim returnValue As New List(Of KeyValuePair(Of Integer, String)) 
    Try 
     Using con As New SqlConnection(ConnectionString) 
      Using cmd As New SqlCommand("SELECT CODE, DESC FROM ltblDELAY WHERE [email protected]", con) 
       cmd.Parameters.Add("@Code", SqlDbType.Int).Value = code 
       con.Open() 
       Using rd = cmd.ExecuteReader() 
        While rd.Read() 
         Dim desc = rd.GetString(1) 
         returnValue.Add(New KeyValuePair(Of Int32, String)(code, desc)) 
        End While 
       End Using 
      End Using 
     End Using 
    Catch ex As Exception 
     Common.LogError(ex, True, False) 
    End Try 
    Return returnValue 
End Function 

Notez que je l'ai utilisé aussi le Using -Déclaration pour faire en sorte que tous les objets qui pourraient contenir des ressources non gérés (comme la connexion) sont disposées propriété (même en cas d'erreur). Cela fermera également la connexion. J'ai également utilisé SqlDatareader.GetString à la place de l'indexeur qui renvoie Object. Votre code ne compilera pas avec Option Strict On que je recommande fortement.


Puisque vous n'êtes intéressé que par la description qui est une chaîne, un retour List(Of String):

Private Function GetReasons(code As Int32) As List(Of String) 
    Dim returnValue As New List(Of String) 
    Try 
     Using con As New SqlConnection(ConnectionString) 
      Using cmd As New SqlCommand("SELECT CODE, DESC FROM ltblDELAY WHERE [email protected]", con) 
       cmd.Parameters.Add("@Code", SqlDbType.Int).Value = code 
       con.Open() 
       Using rd = cmd.ExecuteReader() 
        While rd.Read() 
         Dim desc = rd.GetString(1) 
         returnValue.Add(desc) 
        End While 
       End Using 
      End Using 
     End Using 
    Catch ex As Exception 
     Common.LogError(ex, True, False) 
    End Try 
    Return returnValue 
End Function 
+0

désolé s'il me manque quelque chose, mais cela renvoie la liste entière des chaînes où je veux juste la valeur de chaîne spécifique correspondant à la valeur de code passé? –

+0

@PaulStevens: j'ai filtré dans la base de données: 'WHERE CODE = @ Code'. Il est toujours préférable de filtrer dans la base de données que de sélectionner toutes les données et filtrer sur le client. –