VB.Net中的SQL计算不起作用

时间:2013-11-25 00:33:30

标签: 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

调试器不会超过第一个For循环中的“average = Cdbl(dt.Rows(i)(”hits / atBats“))”行。我不能在循环中做那样的计算吗?我确定列标题(命中和atBats是正确的)

如果你想知道,数据库看起来像这样:

name              Team              atBats        hits

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

谢谢!

2 个答案:

答案 0 :(得分:1)

你遗漏了一些对象引用:

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

和其他人一样。 VB需要dt.Rows(i)引用,因为它们是2个不同的列。使用“hits / atBats”,它无法知道这些是单独的列。

速记,但是他们是不同的cols / items的面具就像你拥有它一样:

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

答案 1 :(得分:0)

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

不是将所有数据都拉到客户端然后使用两个循环来查找名称,而是可以在db-side上执行所有计算,并且只获取所需的行和列(在您的情况下仅为name)查询可能看起来像

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

输出:

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