2013-11-25 2 views
0

Это предварительное задание для класса, в котором я нахожусь. Предполагается, что он довольно прост и действует как разминка, но я не могу заставить его работать. В основном код вводит тестовую базу данных и выполняет расчет. В этом случае я пытаюсь найти самый высокий средний средний уровень в наборе игроков в бейсбол.Расчет SQL в VB.Net не работает

Таким образом, мой конечный результат должен быть именем игрока с самым высоким средним значением ватин или несколькими игроками, если они привязаны к самому высокому среднему значению.

Вот код:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim dt As DataTable = New DataTable() 
    Dim connStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Baseball.accdb" 
    Dim sqlStr As String = "SELECT * FROM Players" 
    Dim dataAdapter As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(sqlStr, connStr) 

    dataAdapter.Fill(dt) 
    dataAdapter.Dispose() 

    Dim average, pastAverage, highestAverage As Double 
    For i As Integer = 0 To dt.Rows.Count - 1 
     average = CDbl(dt.Rows(i)("hits/atBats")) 
     If average > pastAverage Then 
      highestAverage = average 
     End If 
     pastAverage = average 
    Next 

    For i As Integer = 0 To dt.Rows.Count - 1 
     If dt.Rows(i)("hits/atBats") = highestAverage Then 
      lstBoxHighest.Items.Add(dt.Rows(i)("name")) 
     End If 
    Next 

    End Sub 
End Class 

отладчик не будет идти мимо "средних = CDbl (dt.Rows (I) (" хиты/atBats "))" линии в первом цикле For Loop , Могу ли я делать такие вычисления в цикле? Я уверен, что заголовки столбцов (хитов и atBats правильны)

база данных выглядит в случае, если вам интересно:

 
name    Team    atBats  hits 

Derek Jeter  New York Yankees 511   158 
Joe Mauer   Minnesota Twins 545   174 
etc... 

Спасибо!

+0

хитами это имя столбца, и atBats это имя столбца. Я пытаюсь найти средний уровень, разделив хиты atBats. Так что это должен быть расчет. Должен ли я попытаться создать новый столбец, написав имя SELECT, hits/atBats как средний показатель FROM Players? – user3029567

+0

Я добавил, как выглядит база данных, чтобы вы могли видеть столбцы atBats и hits. – user3029567

ответ

1

вам не хватает какой-то объект рефов:

average = CDbl(dt.Rows(i).item("hits")/dt.Rows(i).item("atBats")) 

и т.п., что для остальных из них. VB нуждается в ссылке dt.Rows(i), потому что это 2 разных столбца. С помощью «hits/atBats» он не может знать, что это отдельные столбцы.

Сокращенные, но вид маски, которые они имеют разные COLS/элементы, как у вас было такое:

average = CDbl(dt.Rows(i)("hits")/dt.Rows(i)("atBats")) 
+0

VB.Net фактически не требует свойства 'Item'. 'dt.Rows (i) (" hits ")/dt.Rows (i) (" atBats ")' является вполне допустимым синтаксисом. – pete

+0

Я знаю. Я был в явном виде, чтобы помочь OP понять внутреннюю структуру/содержимое DT и obj ref в целом. Это было некорректно, хотя, спасибо. – Plutonix

+0

Спасибо! Я очень расстраивался – user3029567

0

Отказ от ответственности: это не прямой ответ на этот вопрос.

Вместо того, чтобы вытаскивать все данные клиенту, а затем используя две петли для поиска имени, вы можете делать все вычисления на стороне db и захватывать только нужные строки и столбцы (в вашем случае только name) с запросом, который может выглядеть

SELECT name 
    FROM Players 
WHERE atBats/hits = 
(
    SELECT MAX(atBats/hits) 
    FROM Players 
) 

Выход:

 
|  NAME | 
|-------------| 
| Derek Jeter | 
Смежные вопросы