Получение ошибки как «Параметр недействителен» при получении изображения из базы данных MySQL в PictureBox (vb. net) - PullRequest
0 голосов
/ 24 апреля 2020

Я взял DataGridView и при MouseClick извлекал данные из таблицы базы данных «products», столбец «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

введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

В коде нет сбоев. Дело в том, что изображение было загружено вручную, и именно поэтому оно выдает ошибку. Изображение в базе данных не должно быть загружено непосредственно через CPanel, оно должно быть загружено через приложение (vb. net).

0 голосов
/ 25 апреля 2020

Я изменил имя DataGridViewdb на DataGridView1, чтобы оно соответствовало моей тестовой программе. Я пропустил назначения текстовым полям, и это не является частью вашей проблемы. Блоки

Using...End Using позаботятся о закрытии и удалении объектов вашей базы данных даже в случае ошибки.

Всегда используйте параметры. Это помогает избежать внедрения sql и облегчает написание вашей команды sql (без одинарных кавычек). Это также помогает держать вас в курсе возможных несоответствий типов. Я угадал тип данных вашего поля идентификатора. Проверьте свою базу данных и измените код соответствующим образом. С вашей объединенной командой 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
...