2013-11-25 41 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 |