如何将数据库中的图片添加到PictureBox?

3
我正在使用此方法从数据库中获取图像字节。
cmd.CommandText = "select imagedate from projectimages where imagename = '" + _
    ListBox1.Text + "' and CSVprojectref=checksum('" + textboxFileRef.Text + "')"

Dim img As Object = cmd.ExecuteScalar()

现在我该如何将这个图像添加到PictureBox.image中。我在检索图像并在PictureBox中显示它方面遇到了很多问题。

在SQL数据库中,数据类型为Image,我使用以下代码将图像保存到数据库中:

         Dim ms As New IO.MemoryStream

        If imageFilename.Contains("jpeg") Or imageFilename.Contains("jpg") Then
            imageUpload.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)

        End If
        If imageFilename.Contains("png") Then
            imageUpload.Save(ms, System.Drawing.Imaging.ImageFormat.Png)
        End If
        If imageFilename.Contains("gif") Then
            imageUpload.Save(ms, System.Drawing.Imaging.ImageFormat.Gif)
        End If
        If imageFilename.Contains("bmp") Then
            imageUpload.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp)
        End If

        Dim bytes() As Byte = ms.ToArray
        Dim img As String = Convert.ToBase64String(bytes)


        Dim cmd As New OleDb.OleDbCommand("insert projectimages values('" + imageNameTemp + "','" + img + "',CHECKSUM('" + textboxFileRef.Text + "'))", con)
        cmd.ExecuteNonQuery()

你在使用哪个版本的VB? - Lance Roberts
好的,现在应该会有更多人看了。 - Lance Roberts
我在搜索了数小时后找到了完美的解决方案,有一种特定的方式来存储数据,以便能够完美地检索。由于我不能在8小时内回答自己的问题,所以明天会发布答案。 - ConfusedCoder
5个回答

3

在搜索了5-6个小时的论坛、博客和所有内容后,我找到了这个...可以将图像保存到数据库中。

1- 在数据库中应该使用图像数据类型。

现在,在将图像存储到 SQL 数据库时添加以下代码:

    OpenFileDialog1.ShowDialog()
    imageFilename = OpenFileDialog1.FileName
    Dim imageUpload As Image
    imageUpload = Image.FromFile(OpenFileDialog1.FileName)



    If imageFilename <> "" Then

        Dim imageNameTemp As String

        imageNameTemp = imageFilename

        While (imageNameTemp.Contains("\"))


            imageNameTemp = imageNameTemp.Remove(0, imageNameTemp.IndexOf("\") + 1)
        End While

        Dim ms As New IO.MemoryStream

        If imageFilename.Contains("jpeg") Or imageFilename.Contains("jpg") Then
            imageUpload.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)

        End If
        If imageFilename.Contains("png") Then
            imageUpload.Save(ms, System.Drawing.Imaging.ImageFormat.Png)
        End If
        If imageFilename.Contains("gif") Then
            imageUpload.Save(ms, System.Drawing.Imaging.ImageFormat.Gif)
        End If
        If imageFilename.Contains("bmp") Then
            imageUpload.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp)
        End If

        'Dim cmd As New SqlCommand("INSERT INTO projectimages (imagename,imagedate,csvprojectref) VALUES ('" + imageFilename + "',@BLOBData,CHECKSUM('" + textboxFileRef.Text + "'))", con)

        Dim b() As Byte = ms.ToArray()

        Dim cmd As New SqlCommand("INSERT INTO projectimages (imagename,imagedate,csvprojectref) VALUES ('" + imageNameTemp + "',@BLOBData,CHECKSUM('" + textboxFileRef.Text + "'))", con)

        cmd.Parameters.Add("@BLOBData", SqlDbType.Image, b.Length).Value = b
        '    Dim cmd As New SqlCommand("insert projectimages(imagename,imagedate,csvprojectref) values('imagma','" + img + "',CHECKSUM('" + textboxFileRef.Text + "'))", con)

        cmd.ExecuteNonQuery()

        '  cmdTemp.Parameters.Add("@photo", SqlDbType.Image, b.Length).Value = b

    End If

当需要检索数据并插入到图片框中时,请使用以下代码...
  cmd.CommandText = "select imagedate from projectimages where imagename = '" +      ListBox1.Text + "' and CSVprojectref=checksum('" + textboxFileRef.Text + "')"


        cmd.Connection = con
        Dim da As New SqlDataAdapter(cmd)
        Dim ds As New DataSet()
        da.Fill(ds, "projectimages")
        Dim c As Integer = ds.Tables(0).Rows.Count
        If c > 0 Then
            Dim bytBLOBData() As Byte = _
                ds.Tables(0).Rows(c - 1)("imagedate")
            Dim stmBLOBData As New MemoryStream(bytBLOBData)
            PictureBox1.Image = Image.FromStream(stmBLOBData)
        End If

0

根据Microsoft的建议,使用MemoryStream对象。


同样的错误出现在上面的那一行... "参数无效"。 - ConfusedCoder

0
Dim img As Byte() = DirectCast(cmd.ExecuteScalar(), Byte())
Dim ms as MemoryStream = New MemoryStream(img)
pictureBox.Image = Image.FromStream(ms)

假设imagedate字段是一个字段。

@ConfusedCoder,必须是Dim ms as MemoryStream。看看是否可以解决错误。 - Bala R
我已经和这个问题斗争了两个小时或更长时间 :( - ConfusedCoder
顺便问一下,你所说的imagedate字段是一个blob字段是什么意思? - ConfusedCoder
查看关于blob的信息。但这似乎不是你的问题。也许图像格式不正确或在数据库中损坏了? - Bala R
是的,当我存储图像时,我得到相同的字节长度,因此它可以从数据库中获取所有内容。 - ConfusedCoder
显示剩余2条评论

0
这是我的代码,用于在VB.NET中将Blob文件显示到PictureBox上。希望能对您有所帮助。
Dim connstring As String = "Database=pmk;data source=localhost;user id=root;password="
Dim Sql As String = "select * from mastermahasiswa where Nim='" & TextBox1.Text & "'"
Dim conn As New MySqlConnection(connstring)
Dim cmd As New MySqlCommand(Sql, conn)
Dim dr As MySqlDataReader = Nothing
conn.Open()
dr = cmd.ExecuteReader()
dr.Read()
Dim imagebytes As Byte() = CType(dr("Foto"), Byte())
Using ms As New IO.MemoryStream(imagebytes)
    PictureBox1.Image = Image.FromStream(ms)
    PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
End Using
conn.Close()

0
我也遇到了“参数无效”的错误。为了解决这个问题,我在表单中添加了一个picturebox,将要复制到SQL服务器的图像作为背景图像加载到该picturebox中。这个语句似乎是关键:
PictureBox1.BackgroundImage.Save(ms, PictureBox1.BackgroundImage.RawFormat)

这会使实际上传时间更长,但我不再收到参数错误的提示了... 我想是因为现在图片实际上是有效的图像。

        SSScmd.CommandText = "INSERT INTO PreviewSlideshow (Name, Photo) VALUES (@name, @photo)"

        Dim p As New SqlParameter("@photo", SqlDbType.Image)

        For Each CurFile As IO.FileInfo In New IO.DirectoryInfo(sSourcePath).GetFiles

            If CurFile.Name = "Thumbs.db" Then
                'skip
            Else

                If CurFile.Extension = "jpg" Or CurFile.Extension = "png" Then

                    'show the image name on the form
                    ImageName.Text = CurFile.Name

                    SSScmd.Parameters.AddWithValue("@name", ImageName.Text)

                    Dim ms As New MemoryStream()

                    PictureBox1.BackgroundImage = Image.FromFile(sSourcePath & CurFile.Name)

                    PictureBox1.BackgroundImageLayout = ImageLayout.Stretch

                    PictureBox1.BackgroundImage.Save(ms, PictureBox1.BackgroundImage.RawFormat)

                    Dim data As Byte() = ms.GetBuffer()

                    p.Value = data

                    SSScmd.Parameters.Add(p)

                    SSScmd.ExecuteNonQuery()

                    SSScmd.Parameters.Clear()



                End If
            End If

        Next

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接