VB.NET MySQL 查询不返回值
Posted
技术标签:
【中文标题】VB.NET MySQL 查询不返回值【英文标题】:VB.NET MySQL query returns no value 【发布时间】:2020-02-24 18:05:11 【问题描述】:我正在尝试在 vb.net 中使用 mysql 在组合框中显示值。现在我面临的问题是组合框没有显示来自 MySQL 的值。我有以下代码:
MySqlConn = New MySqlConnection
MySqlConn.ConnectionString = "server=localhost;userid=root;password=root;database=s974_db"
Try
MySqlConn.Open()
Label21.Text = "DB Connection Successful"
Dim Query As String
Query = "select * from s974_db.processors where Name='" & ComboBox1.Text & "'"
COMMAND = New MySqlCommand(Query, MySqlConn)
READER = COMMAND.ExecuteReader
While READER.Read
Label10.Text = READER.GetDouble("Price")
End While
MySqlConn.Close()
Catch ex As MySqlException
MessageBox.Show(ex.Message)
Finally
MySqlConn.Dispose()
End Try
但是,使用上面的代码 Combobox1.Text 什么都不返回,但如果我使用下面的代码,它有不同的查询,它可以工作:
MySqlConn = New MySqlConnection
MySqlConn.ConnectionString = "server=localhost;userid=root;password=root;database=s974_db"
Try
MySqlConn.Open()
Label21.Text = "DB Connection Successful"
Dim Query As String
Query = "select * from s974_db.processors"
COMMAND = New MySqlCommand(Query, MySqlConn)
READER = COMMAND.ExecuteReader
While READER.Read
Dim sName = READER.GetString("Name")
ComboBox1.Items.Add(sName)
End While
MySqlConn.Close()
Catch ex As MySqlException
MessageBox.Show(ex.Message)
Finally
MySqlConn.Dispose()
End Try
有人可以检查并告诉我可能是什么问题吗?谢谢!
【问题讨论】:
请学习如何在vb net中使用prepared statements,因为当你的第一个代码不起作用时,每个代码都可能受到sql注入的影响,mysql告诉你你没有符合那个标准的数据。如果它们在 mysql 工作台中不起作用,请测试您的查询以查看它们是否给出任何结果还检查组合框的文本 第一个代码示例似乎只设置了标签文本属性。第二个代码示例设置组合框项。Query = "select * from s974_db.processors where Name='" & ComboBox1.Text & "'"
- 请显示Debug.Print Query
。
@nbk 组合框文本为空。但是,我不能在 MySQL 中测试该命令,因为它涉及组合框,这意味着它不起作用。
@AndrewMortimer 第一个代码示例应该至少填充组合框,至少这是这个想法,但它不会第二个代码示例工作正常,但我无法用它实现我需要的.我正在尝试从表中获取名称并填充到组合框中,然后当基于该名称选择名称时,它会使用价格填充标签。
【参考方案1】:
所以我在 cmets 中提到的亮点
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' You need only to open aconnection once
MySqlConn = New MySqlConnection
MySqlConn.ConnectionString = "server=localhost;userid=root;password=root;database=s974_db"
Try
MySqlConn.Open()
Label21.Text = "db connection successful"
'First load both Combobox
Dim query As String
query = "select * from s974_db.processors"
COMMAND = New MySqlCommand(query, MySqlConn)
READER = COMMAND.ExecuteReader
While READER.Read
Dim sname = READER.GetString("name")
ComboBox1.Items.Add(sname)
ComboBox2.Items.Add(sname)
End While
Catch ex As MySqlException
MessageBox.Show(ex.Message)
Finally
End Try
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Closing
Try
MySqlConn.Close()
MySqlConn.Dispose()
Catch ex As Exception
End Try
End Sub
现在是组合框
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ComboBox1.SelectedIndexChanged
'Only when there is a item selected , ask for data
If ComboBox1.SelectedIndex > -1 Then
Try
Dim Query As String
Query = "select * from s974_db.processors where Name='" & ComboBox1.Text & "'"
COMMAND = New MySqlCommand(Query, MySqlConn)
READER = COMMAND.ExecuteReader
While READER.Read
Label11.Text = READER.GetDouble("Price")
End While
Catch ex As MySqlException
MessageBox.Show(ex.Message)
Finally
End Try
End If
End Sub
Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedIndexChanged
If ComboBox2.SelectedIndex > -1 Then
Try
Dim Query As String
Query = "select * from s974_db.processors where Name='" & ComboBox1.Text & "'"
COMMAND = New MySqlCommand(Query, MySqlConn)
READER = COMMAND.ExecuteReader
While READER.Read
Label10.Text = READER.GetDouble("Price")
End While
Catch ex As MySqlException
MessageBox.Show(ex.Message)
Finally
End Try
End If
End Sub
这与我在 Form_load 中描述的完全一样,你填写了两个组合框
当您现在更改其中一个组合框时,其中一个标签也会更改。
有时您必须更新元素才能看到变化
在这种情况下,你写在循环的末尾
Label10.Update()
【讨论】:
您在表单关闭之前留下一个连接在微风中飘动!?! 嗨@nbk 你太棒了!非常感谢你帮助我。现在我更好地理解了这个概念,并且确实解决了另一个小问题,即必须关闭 Reader,因为我们将在 ComboBox1_SelectedIndexChanged Sub 中再次使用它 再次非常感谢您。你是最棒的! 我将语言注释标签添加到代码部分以消除红色。似乎如果您在代码中的单独行中添加注释,编辑器会将其余代码视为字符串。啊!【参考方案2】:从顶部开始... 将您的数据库对象保持在使用它们的方法的本地。 (不是表单级别的变量)您可以使连接字符串成为类级别的字符串变量。这是确保它们被关闭和处置的唯一方法。
Using...End Using
块将关闭并处置您的数据库对象,即使出现错误。连接的构造函数采用连接字符串。连接是宝贵的对象。在 .Execute
方法之前不要打开连接,并尽快关闭它。
用户可以在ComboBox1
之前选择Form.Load
之前的项目没有多大意义。
一般来说,我们不想下载不必要的数据,我们希望尽可能少地访问数据库。在Form.Load
中,我们将组合框绑定到包含名称和价格字段的数据表,设置显示和值成员。现在,只要用户在组合中选择一个名称,我们就可以检索价格而无需再次连接到数据库。
我注意到您在另一个活动中使用了Val
。这是一种旧的 VB6 方法,可以给您带来意想不到的结果。 .Net 和 vb.net 有各种方法可以更快、更可靠地从字符串中获取数字。 CInt
、.TryParse
、.Parse
、CType
、Convert.To
等
Public Class Form1
Private ConString As String = "server=localhost;userid=root;password=root;database=s974_db"
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Fill combobox
Dim dt As New DataTable
Using cn As New MySqlConnection(ConString),
cmd As New MySqlCommand("select Name, Price from processors;", cn)
cn.Open()
dt.Load(cmd.ExecuteReader)
End Using 'Closes and disposes both connection and command
ComboBox1.DataSource = dt
ComboBox1.DisplayMember = "Name"
ComboBox1.ValueMember = "Price"
End Sub
Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted
Label10.Text = ComboBox1.SelectedValue.ToString
ClearLabels()
End Sub
Private Sub ClearLabels()
Label11.Text = ""
Label12.Text = ""
Label13.Text = ""
Label14.Text = ""
Label15.Text = ""
Label16.Text = ""
Label17.Text = ""
Label18.Text = ""
Label19.Text = ""
Label20.Text = ""
End Sub
End Class
【讨论】:
以上是关于VB.NET MySQL 查询不返回值的主要内容,如果未能解决你的问题,请参考以下文章
当我在 VB.NET 中修改 SQL 查询时,.tag 返回 Nothing
如何在 vb.net 中的 mysql 中按分段值查询 123-456-789?
将 DateTimePicker 时间格式值设置为从数据库 VB.NET 返回的值