2017-02-10 1 views
0

J'ai créé une requête SQL qui renvoie une table:VB - Requête sql vers lecteur ou datatable puis vers des zones de texte

FAMILLE | NUMÉROS
famille a | 11
famille b | 5
famille c | 17
famille d | 28

j'ai, dans Visual Basic (Visual Studio 2015) a renvoyé ces données à un DataTable en utilisant ce code:

Dim cn As New SqlConnection 
Dim conn As New SqlConnection("connection string here") 

Dim cmd As New SqlCommand 
Dim reader As SqlDataReader 
Dim da2 As New SqlDataAdapter 
cmd.CommandText = "select ........ " 
cmd.CommandType = CommandType.Text 
cmd.Connection = conn 

reader = cmd.ExecuteReader()` 

* est ici où je suis perdu *

i besoin code pour sélectionner le nombre de problèmes (colonne 2) basé sur la valeur dans la colonne 1 (famille)

mon problème est que parfois, une des familles peut ne pas avoir un enregistrement, de sorte que l'ensemble de données pourrait avoir seulement famil ies a, c, et d ... la prochaine fois qu'il pourrait avoir des familles b, et d. donc je ne peux pas vraiment utiliser row (#). J'ai besoin de code pour que je puisse référencer le nom de la famille, puis renvoyer le nombre de problèmes, mettre ce nombre dans une chaîne, puis placer cette valeur dans une zone de texte. Je suis bon avec l'attribution de la chaîne à une variable, puis dans la zone de texte ... c'est l'entre-deux que je ne peux pas comprendre!

Merci!

+1

Si vous remplissez une datatable plutôt que d'essayer d'anticiper ce qui sera renvoyé, vous obtiendrez N lignes. '" select ..... "ne nous dit pas grand-chose sur ce à quoi ressemblent les données. S'il y a une clause where, vous pouvez contrôler ce qui revient – Plutonix

Répondre

2

Je vous suggère d'utiliser un SqlDataAdapter pour remplir un DataTable, puis utilisez LINQ to DataTable pour obtenir ce dont vous avez besoin. De plus, utilisez toujours le using -Déclaration:

Dim table = New DataTable() 
Using conn As New SqlConnection("connection string here") 
    Using da = New SqlDataAdapter("select ........ ", conn) 
     da.Fill(table) 
    End Using 
End Using 

Dim matchingFamily = From row In table.AsEnumerable() 
        Where row.Field(Of String)("Family") = "family a" 
If matchingFamily.Any() Then 
    Dim familyIssueCount As Int32 = matchingFamily.First().Field(Of Int32)("Issues") 
    ' ... ' 
End If 

S'il est possible que plusieurs lignes contiennent cette famille que vous pouvez utiliser une approche différente puisque First va choisir une ligne arbitraire. Une façon consiste à utiliser un For Each pour les énumérer ou utiliser matchingFamily.Sum(Function(r) r.Field(Of Int32)("Issues")) pour résumer les problèmes.

Si vous n'avez pas besoin de tous les enregistrements en mémoire, vous pouvez également sélectionner uniquement les enregistrements pertinents de la base de données avec ...WHERE Family = @family.

+0

Merci pour cette information - je vais travailler avec cela et voir si je peux trouver une solution qui fonctionne .... Je pense que j'ai quelque chose en tête, mais jouera avec il. – Fredderf81

-1
Private Sub GetFamilyIssues(ByVal FamilyName As String) 
    Dim cn As New SqlConnection("connection string here") 
    cn.Open() 

    Dim sql As String = "select * from FamilyIssues where FAMILY = @Family" 

    Dim cmd As New SqlCommand(sql, cn) 
    cmd.Parameters.AddWithValue("@Family", FamilyName) 

    Dim reader As SqlDataReader = cmd.ExecuteReader 

    txtIssues.Text = "" 
    If reader.HasRows Then 
     txtIssues.Text = reader("ISSUES").ToString() 
    End If 

    cn.Close() 
End Sub