这是我所在课程的预先作业。假设非常简单并且充当热身,但我无法让它发挥作用。基本上,代码引入了测试数据库并执行计算。在这种情况下,我试图在一组棒球运动员中找到最高的平均击球率。
所以我的最终结果应该是击球率最高的球员的名字,或者如果他们并列最高的平均值,那么应该是少数球员。
以下是代码:
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...
谢谢!
答案 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 |