在vb.net中获取数据表的最后一行

时间:2018-11-18 13:43:51

标签: 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_change事件中。谢谢

2 个答案:

答案 0 :(得分:2)

与其在程序中完成工作,不如让数据库来进行数据选择。

LarsTech在comment中介绍了其他要点:在将数据传递到数据库查询时,您应该随时使用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

...并在设置好组合框后以编程方式添加处理程序:

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 Event,尽管其备注为“但是,根据ComboBox的配置方式以及用户如何更改所选项目,可能不会引发SelectionChangeCommitted事件。 “

答案 1 :(得分:0)

不确定在这里,但是可以尝试。正如LarsTech所解释的那样,您没有任何疑问。我可能在这里完全不对,但由于我们看不到您的所有代码,您是否尝试将Page load事件与以下内容一起包含

Protected Sub Page_Load
   If Not Page.IsPostBack Then
     ' Do something here
   End If
End Sub

基本上,可能是页面回发时可能会触发您的代码,仅当您选择组合框或按钮时才希望它触发。