簡體   English   中英

在vb.net中獲取數據表的最后一行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM