【问题标题】:how to add rows to mysql database table and display it in a listbox in vb.net?如何在 mysql 数据库表中添加行并将其显示在 vb.net 的列表框中?
【发布时间】:2011-09-25 09:57:09
【问题描述】:

我有以下控件:

  • textbox1 - 这是我输入消息的地方。
  • listbox1 - 这是我显示消息的地方。
  • button1 -这是将我的消息发布到服务器的地方。
  • StatusStrip1.Title1 - 这是当前用户的标题所在的位置。 (即:管理员、经理……等)

我在 MYSQL 数据库中有一个名为“messages”的表和一个名为“message”的列。当我在 textbox1 中输入内容并单击 button1 时,我想在“消息”列下的“消息”中添加一行,标题和消息作为其值。(由连字符、破折号或其他小分隔符分隔)然后重新加载 listbox1内容以显示新消息。

所以我希望最后的消息是这样的:

管理员 - Hello World!

我目前有以下代码:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim sqlpost As MySqlCommand = New MySqlCommand("INSERT INTO messages(message) VALUES(?name - ?message)"";", con)
    sqlpost.Parameters.AddWithValue("?name", Title2.Text)
    sqlpost.Parameters.AddWithValue("?message", TextBox1.Text)
    Try
        con.Close()
        con.Open()

        ' Sending message.
        If TextBox1.Text = "" Then
            MessageBox.Show("You forgot to type a message!")
        Else
            sqlpost.ExecuteNonQuery()

            ' Reloading messages.

            ListBox1.Items.Clear()
            reader = sqlmessages.ExecuteReader()
            While (reader.Read)
                ListBox1.Items.Add(reader.Item("message"))
                ListBox1.Items.Add("")

            End While
            reader.Close()
            con.Close()
            TextBox1.Text = ""
            Label4.Text = "Message Sent!"
            Timer2.Start()
        End If

    Catch myerror As MySqlException
        MessageBox.Show("Error sending message to server: " & myerror.Message)
    End Try

End Sub

我以前可以使用它,但是当我对其进行更改时,它出现了各种 sql 语句语法错误...(诸如“管理员”的无效截断值或无效的 DOUBLE 值“hello”之类的东西)现在它甚至不会显示当前“消息”表中的任何消息...)

如果有人能告诉我我做错了什么,或者更有效的方法,那么我将不胜感激!谢谢!

【问题讨论】:

    标签: mysql sql vb.net listbox


    【解决方案1】:

    我看到看起来不正确的一件事是您使用的是“?”为您查询中的参数名称。用于参数名称的默认字符是以“@”开头。虽然我认为有一个连接字符串选项可以使用“?”因为这是旧版本的 MySQL 连接器中使用的,但当前默认值为“@”。此外,您的命令总体上似乎存在一些问题。你有:

    Dim sqlpost As MySqlCommand = New MySqlCommand("INSERT INTO messages(message) VALUES(?name - ?message)"";", con)
    

    应该更像

    Dim sqlpost As MySqlCommand = New MySqlCommand("INSERT INTO messages(message) VALUES(@message);", con)
    

    我稍微修正了查询,并替换了 ?和 @。您可以在 VB 中连接名称和消息(正如您在评论中清除的那样),使用如下代码:

    sqlpost.Parameters.AddWithValue("@message", Title2.Text & " - " & Title2.Text)
    

    我也看到你在打电话

    sqlmessages.ExecuteReader()
    

    但我看不到这是在哪里初始化的。

    【讨论】:

    • 很有趣,虽然我的意图是使最终消息成为人员标题(由 name 参数表示)和他们键入的消息(由 message 参数表示)的组合,并用“ -“ 特点。所以如果标题是“admin”并且消息是“hello world”,我希望显示的最终消息是“admin - hello world”
    • @Kibbee - MySql 连接器不使用 @ 语法来分配参数名称。
    • 查看我最近的更改以了解如何完成此操作。
    • @AVD 是的,MySQL 连接器确实使用 @ 作为参数名称,除非您在连接字符串中使用“OldSyntax”选项,如此处所述。 dev.mysql.com/doc/refman/5.1/en/… 或者您使用的是真正旧版本的连接器。甚至不再支持进一步阅读 OldSyntax 参数。
    【解决方案2】:

    你应该使用单个参数。

    Dim con as New MySqlConnection
    con.ConnectionString="set_connection_string_here"
    Dim sqlpost As MySqlCommand = New MySqlCommand("INSERT INTO `messages` (`message`) VALUES (@name)",con)
    sqlpost.Parameters.AddWithValue("@name", Title2.Text & " - " & TextBox1.Text)
    
    If TextBox1.Text = "" Then
        MessageBox.Show("You forgot to type a message!")
    Else
      con.Open()
      sqlpost.ExecuteNonQuery()
      con.Close()
    
      ListBox1.Items.Clear()
      sqlmessages.CommandText="select * from `messages`"
      sqlmessages.Connection=con
      reader = sqlmessages.ExecuteReader()
      While (reader.Read)
              ListBox1.Items.Add(reader.Item("message"))
      End While
      reader.Close()
      con.Close()
    End If
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多