[英]Getting last row of a datatable in vb.net
我只是想從特定列中滿足條件的數據庫中獲取數據,並同時獲取特定列(它是滿足條件的數據庫行集合的成員)的最后一個值。 我有這個代碼
connection.Open()
command = New MySqlCommand("SELECT * FROM test.solemn WHERE pump = '" + PumpComboBox.SelectedValue.ToString + "'", connection)
da.SelectCommand = command
da.Fill(dt)
Dim omr = dt.Rows(dt.Rows.Count - 1)("meter_reading")
With Me.TextBox3
.Text = omr
End With
connection.Close()
上面的代碼旨在從數據庫表中獲取所有列,其中列泵等於用戶在組合框“ PumpComboBox”中選擇的值,然后將數據填充到數據表中,然后此代碼行
Dim omr = dt.Rows(dt.Rows.Count - 1)("meter_reading")
旨在在Meter_reading列上找到最后一個值,但是我得到一個異常“在位置-1處沒有行”,即使PumpCombobox的.selectedIndex設置為-1,用戶也沒有在PumpCombobox上進行選擇。 該代碼在pumpcombobox_change事件中。 謝謝
與其在程序中進行工作,不如在數據庫中進行數據選擇。
LarsTech在評論中還談到了其他要點:在將數據傳遞到數據庫查詢時,您應該使用SQL參數-這樣可以使事情順利進行並減少奇怪的問題。 並且您應該處理沒有有效選擇值的情況。
請注意,如果您未指定順序,則數據庫可以自由以任何順序返回結果行,並且兩次執行完全相同的查詢時該順序甚至可能都不相同,因此您可能會得到錯誤的結果。 我假設有一個名為“ reading_date”的列,並且您想要最新的讀數-根據需要進行調整。
If PumpComboBox.SelectedIndex >= 0 Then
Dim pump = CStr(PumpComboBox.SelectedValue)
Dim result As Object = Nothing
Using cmd As New MySqlCommand("SELECT meter_reading FROM test.solemn WHERE pump = @pump ORDER BY reading_date DESC LIMIT 1", connection)
cmd.Parameters.Add(New MySqlParameter With {.ParameterName = "@pump", .DbType = DbType.String, .Value = pump})
connection.Open()
result = cmd.ExecuteScalar()
connection.Close()
End Using
If result IsNot Nothing Then
TextBox3.Text = CStr(result)
Else
' there are no readings for the selected pump
End If
End If
(您可能需要更改.DbType = DbType.String
我沒有安裝MySQL進行檢查。)
如果您不希望觸發SelectedIndexChanged事件時遇到問題,則可以從事件處理程序中刪除Handles
子句:
Private Sub PumpComboBox_SelectedIndexChanged(sender As Object, e As EventArgs)
' code here...
End Sub
...並在設置ComboBox 之后以編程方式添加處理程序:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' other code....
SetupPumpComboBox()
AddHandler PumpComboBox.SelectedIndexChanged, AddressOf PumpComboBox_SelectedIndexChanged
' other code....
End Sub
也可以使用ComboBox.SelectionChangeCommitted事件 ,盡管其備注為“但是,取決於ComboBox的配置方式以及用戶如何更改所選項目,可能不會引發SelectionChangeCommitted事件。”
不太確定在這里,但是可以嘗試一下。 正如LarsTech所解釋的那樣,您沒有任何疑問。 我在這里可能完全不合時宜,但是由於我們看不到您的所有代碼,您是否嘗試將Page load事件包含以下內容
Protected Sub Page_Load
If Not Page.IsPostBack Then
' Do something here
End If
End Sub
基本上,可能是頁面回發時可能會觸發代碼,僅當您選擇組合框或按鈕時才希望觸發代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.