2017-02-10 2 views
0

Я создал SQL-запрос, который возвращает таблицу:VB - запрос sql к читателю или datatable, затем к текстовым полям

СЕМЬЯ | ВОПРОСЫ
family a | 11
family b | 5
family c | 17
family d | 28

у меня есть, в Visual Basic (Visual Studio 2015) возвращал эти данные в DataTable, используя этот код:

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()` 

* здесь, где я теряюсь *

мне нужно код для выбора количества выпусков (столбец 2) на основе значения в столбце 1 (семейство)

Моя проблема заключается в том, что в некоторых случаях у одной из семей не может быть записи, поэтому набор данных может иметь только фамилию ies a, c и d ... в следующий раз он может иметь семейства b и d. поэтому я не могу использовать строку (#). Мне нужен код, который я могу связать с фамилией, а затем возвратить количество проблем, поместить это число в строку и затем поместить это значение в текстовое поле.

Мне хорошо с назначением строки переменной, а затем в текстовое поле ... ее промежуточный, который я не могу понять!

Спасибо!

+1

Если вы заполняете datatable, а не пытаетесь предвидеть, что будет возвращено, вы получите N строк. '" select ..... "не говорит нам много о том, как выглядят данные. Если есть предложение where, вы можете контролировать то, что возвращается – Plutonix

ответ

2

Я бы предложил использовать SqlDataAdapter для заполнения DataTable, а затем использовать Linq-To-DataTable, чтобы получить то, что вам нужно. Кроме того, всегда используйте using -statement:

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 

Если это возможно, что несколько строк содержат это семейство вы можете использовать другой подход, поскольку First подберет произвольную строку. Один из способов заключается в использовании For Each для перечисления их или использования matchingFamily.Sum(Function(r) r.Field(Of Int32)("Issues")) для суммирования проблем.

Если вам не нужны все записи в памяти, вы также можете выбрать только соответствующие записи из базы данных с помощью ...WHERE Family = @family.

+0

Спасибо за эту информацию - я буду работать с этим и посмотреть, смогу ли я найти решение, которое работает ... Я думаю, что у меня есть что-то в виду, но я буду играть с Это. – 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 
Смежные вопросы