2017-02-10 7 views
0

Ich habe eine SQL-Abfrage erstellt, die eine Tabelle zurückgibt:VB - SQL-Abfrage an Leser oder Datentabelle dann an Textfelder

FAMILY | AUSGABEN
Familie a | 11
Familie b | 5
Familie c | 17
Familie d | 28

ich habe, in Visual Basic (Visual Studio 2015) zurück diese Daten an eine Datentabelle mit diesem 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()` 

* hier ist, wo ich bin verloren *

ich brauche Code, um die Anzahl der Probleme (Spalte 2) basierend auf dem Wert in Spalte 1 (Familie)

mein Problem ist, dass einige der Familien möglicherweise nicht eine Aufzeichnung haben, so dass der Datensatz nur famil haben könnte ies a, c und d ... das nächste Mal könnte es Familien b und d haben. also kann ich nicht wirklich row (#) verwenden. Ich brauche Code, den ich auf den Familiennamen verweisen kann und dann die Anzahl der Probleme zurückgeben, diese Zahl in eine Zeichenfolge eingeben und diesen Wert dann in ein Textfeld eingeben.

ich bin gut mit der Zuordnung der Zeichenfolge zu einer Variablen und dann in den Textkasten ... es ist die dazwischen, dass ich nicht herausfinden kann!

Vielen Dank!

+1

Wenn Sie eine Datentabelle füllen, statt zu antizipieren, was zurückgegeben wird, erhalten Sie N Zeilen. "select ....." sagt uns nicht viel darüber aus, wie die Daten aussehen. Wenn es eine Where-Klausel gibt, können Sie kontrollieren, was zurückkommt. – Plutonix

Antwort

2

Ich würde vorschlagen, eine SqlDataAdapter zu verwenden, um eine DataTable zu füllen, dann verwenden Linq-To-Datatable zu bekommen, was Sie brauchen. Verwenden Sie auch immer den using -Aussage:

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 

Wenn es möglich ist, dass mehrere Zeilen enthalten diese Familie, die Sie vielleicht einen anderen Ansatz verwenden, da First wird eine willkürliche Reihe holen. Eine Möglichkeit ist die Verwendung eines For Each, um sie aufzuzählen oder matchingFamily.Sum(Function(r) r.Field(Of Int32)("Issues")), um die Probleme zu summieren. Wenn Sie nicht alle Datensätze im Speicher benötigen, können Sie auch nur die relevanten Datensätze aus der Datenbank mit ...WHERE Family = @family auswählen.

+0

Vielen Dank für diese Information - ich werde damit arbeiten und sehen, ob ich eine Lösung finden kann, die funktioniert .... Ich denke, ich habe etwas im Sinn, aber werde mit rumspielen es. – 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 
Verwandte Themen