繁体   English   中英

将图像从 MySQL 数据库获取到 PictureBox(vb.net)时出现“参数无效”错误

[英]Getting error as “Parameter is not valid” while fetching image from MySQL database to PictureBox (vb.net)

我拿了一个 DataGridView 并在 MouseClick 上从数据库表“产品”的“pimg”列中获取数据。
我参考了这个链接https://www.sourcecodester.com/tutorials/visual-basic-net/12592/how-retrieve-image-mysql-database-using-vbnet.html
当我尝试在图片框中显示获取的图像时,它会显示错误为“参数无效”

Private Sub DataGridViewdb_MouseClick(sender As Object, e As MouseEventArgs) Handles DataGridViewdb.MouseClick
        Dim connection As New MySqlConnection("datasource=localhost;port=3306;username=root;password=;database=id12302075_bdukan")
        Dim da As New MySqlDataAdapter
        Try
            Dim i As Integer
            i = DataGridViewdb.CurrentRow.Index
            Me.Labelid.Text = DataGridViewdb.Item(0, i).Value
            Me.TextBoxpid.Text = DataGridViewdb.Item(1, i).Value
            Me.TextBoxcid.Text = DataGridViewdb.Item(2, i).Value
            Me.TextBoxuid.Text = DataGridViewdb.Item(3, i).Value
            Me.TextBoxpname.Text = DataGridViewdb.Item(4, i).Value
            Me.TextBoxpyprice.Text = DataGridViewdb.Item(5, i).Value
            Me.TextBoxpprice.Text = DataGridViewdb.Item(6, i).Value
            Me.TextBoxpweight.Text = DataGridViewdb.Item(7, i).Value
            Me.TextBoxpstock.Text = DataGridViewdb.Item(8, i).Value

            connection.Open()

            Dim cmd = New MySqlCommand("select pimg from products where id='" &
              DataGridViewdb.Item(0, i).Value & "'", connection)


            Dim dt As New DataTable

            Dim arrImage() As Byte

            da.SelectCommand = cmd
            da.Fill(dt)

            arrImage = dt.Rows(0).Item(0)
            Dim mstream As New System.IO.MemoryStream(arrImage)
            PictureBox1.Image = Image.FromStream(mstream)



        Catch ex As Exception
            MessageBox.Show(ex.Message)
            da.Dispose()
            connection.Close()

        End Try

    End Sub

在此处输入图像描述

我将DataGridView1的名称更改为DataGridViewdb ,以便与我的测试程序匹配。 我遗漏了对文本框的分配,例如它不是您问题的一部分。

Using...End Using块将负责关闭和处置您的数据库对象,即使出现错误也是如此。

始终使用参数。 它有助于避免 sql 注入并使您的 sql 命令更易于编写(无需处理单引号)。 它还有助于让您了解潜在的类型不匹配。 我猜到了你的 id 字段的数据类型。 检查您的数据库并相应地调整代码。 通过连接 sql 命令,您将传递一个带有单引号的字符串。 大多数 id 字段都是整数。

由于您只检索单行中的单列,因此可以使用.ExecuteScalar

Private Sub DataGridView1_MouseClick(sender As Object, e As MouseEventArgs) Handles DataGridView1.MouseClick
    Dim i = DataGridView1.CurrentRow.Index
    Dim b As Object
    Using connection As New MySqlConnection("datasource=localhost;port=3306;username=root;password=;database=id12302075_bdukan"),
            cmd As New MySqlCommand("select pimg from products where id= @id;", connection)
        cmd.Parameters.Add("@id", MySqlDbType.Int32).Value = CInt(DataGridView1.Item(0, i).Value)
        connection.Open()
        b = cmd.ExecuteScalar
    End Using
    Dim arrImage = CType(b, Byte())
    Dim mstream As New System.IO.MemoryStream(arrImage)
    PictureBox1.Image = Image.FromStream(mstream)
End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM