2013-11-25 38 views
0

这是为我所在的课程进行的预先分配。假设它非常简单并充当热身活动,但我无法使其工作。基本上,代码引入了测试数据库并执行计算。在这种情况下,我试图找到一组棒球运动员中最高的平均击球平均数。VB.Net中的SQL计算不起作用

所以我的最终结果应该是击球平均得分最高的球员的名字,或者如果他们平均得分最高,那么他们的名字应该是少数。

下面是代码:

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(ⅰ)(” 命中/ atBats “))” 中的第一个for循环线。我不能在循环中进行这样的计算吗?我相信列标题(命中和atBats是正确的)

数据库看起来像这样的情况下,你想知道:

 
name    Team    atBats  hits 

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

谢谢!

+0

命中是列名,atBats是列名。我试图通过atBats除以命中来找到击球平均数。所以它应该是一个计算。我应该尝试通过写入SELECT名创建一个新的列,命中/ atBats作为击球平均来自玩家? – user3029567

+0

我加了什么数据库看起来像所以你可以看到atBats和命中列 – user3029567

回答

1

你缺少一些对象裁判:

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

,并像他们的休息。 VB需要一个dt.Rows(i)引用,因为它们是2个不同的列。用“点击/ 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的一般内部结构/内容。这是一种措辞错误,谢谢。 – Plutonix

+0

谢谢!我感到非常沮丧 – user3029567

0

免责声明:这不是一个直接的问题的答案。

而不是将所有的数据拉到客户端,然后使用两个循环来找到一个名称,你可以做所有的数据库计算和只抓住需要的行和列(在你的情况只是name)与查询可能看起来像

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

输出:

 
|  NAME | 
|-------------| 
| Derek Jeter |