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事件中。谢谢
答案 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
基本上,可能是页面回发时可能会触发您的代码,仅当您选择组合框或按钮时才希望它触发。