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.ParseCTypeConvert.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 函数返回

如何在 vb.net 中的 mysql 中按分段值查询 123-456-789?

将 DateTimePicker 时间格式值设置为从数据库 VB.NET 返回的值

vb.net 如何调用dll . 调用时总是出错. 找不到入口点..无法返回值... 需要详细的.谢谢!

oracle如何从函数中返回值表