VB.net - 直接从Picturebox插入/检索mysql数据库中的图片

时间:2011-02-17 19:32:51

标签: .net mysql vb.net

我很想找到适用于此的代码片段。通过使用此代码,我已经达到了将图片存储为blob(可能不正确)的程度。

Dim filename As String = txtName.Text + ".jpg"
Dim FileSize As UInt32
Dim ImageStream As System.IO.MemoryStream

ImageStream = New System.IO.MemoryStream
PbPicture.Image.Save(ImageStream, System.Drawing.Imaging.ImageFormat.Jpeg)
ReDim rawdata(CInt(ImageStream.Length - 1))
ImageStream.Position = 0
ImageStream.Read(rawdata, 0, CInt(ImageStream.Length))
FileSize = ImageStream.Length

Dim query As String = ("insert into actors (actor_pic, filename, filesize) VALUES    (?File, ?FileName, ?FileSize)")
cmd = New MySqlCommand(query, conn)
cmd.Parameters.AddWithValue("?FileName", filename)
cmd.Parameters.AddWithValue("?FileSize", FileSize)
cmd.Parameters.AddWithValue("?File", rawData)

cmd.ExecuteNonQuery()

MessageBox.Show("File Inserted into database successfully!", _
"Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)

但是在使用以下代码检索到图片框时:

Private Sub GetPicture()
    'This retrieves the pictures from a mysql DB and buffers the rawdata into a memorystream 

    Dim FileSize As UInt32
    Dim rawData() As Byte
    Dim conn As New MySqlConnection(connStr)

    conn.Open()
    conn.ChangeDatabase("psdb")

    Dim cmd As New MySqlCommand("SELECT actor_pic, filesize, filename FROM actors WHERE actor_name = ?autoid", conn)
    Cmd.Parameters.AddWithValue("?autoid", Actor1Box.Text)

    Reader = cmd.ExecuteReader
    Reader.Read()

    'data is in memory 

    FileSize = Reader.GetUInt32(Reader.GetOrdinal("filesize"))
    rawData = New Byte(FileSize) {}

    'get the bytes and filesize 
    Reader.GetBytes(Reader.GetOrdinal("actor_pic"), 0, rawData, 0, FileSize)

    Dim ad As New System.IO.MemoryStream(100000)
    ' Dim bm As New Bitmap

    ad.Write(rawData, 0, FileSize)

    Dim im As Image = Image.FromStream(ad) * "error occurs here" (see below)
    Actor1Pic.Image = im

    Reader.Close()
    conn.Close()
    conn.Dispose()
    ad.Dispose()

我在注明的区域中收到错误“参数无效”。仅供参考如果有人甚至有一些比这更好(工作)的代码示例,我可以插入而不是调试这个混乱,这也很棒。

5 个答案:

答案 0 :(得分:2)

好吧,自从得不到任何帮助后,我对这个问题感到震惊并终于开始工作了。这是我的工作代码。

从Picturebox中保存到MySQL(pbPicture)

    Dim filename As String = txtName.Text + ".jpg"
    Dim FileSize As UInt32

    conn.Close()

    Dim mstream As New System.IO.MemoryStream()
    PbPicture.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg)
    Dim arrImage() As Byte = mstream.GetBuffer()

    FileSize = mstream.Length
    Dim sqlcmd As New MySqlCommand
    Dim sql As String
    mstream.Close()

    sql = "insert into [your table]  (picture, filename, filesize) 
                               VALUES(@File, @FileName, @FileSize)"

    Try
        conn.Open()
        With sqlcmd
            .CommandText = sql
            .Connection = conn
            .Parameters.AddWithValue("@FileName", filename)
            .Parameters.AddWithValue("@FileSize", FileSize)
            .Parameters.AddWithValue("@File", arrImage)

            .ExecuteNonQuery()
        End With
    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        conn.Close()
    End Try

从MySQL数据库加载回到Picturebox

   Dim adapter As New MySqlDataAdapter
    adapter.SelectCommand = Cmd

    data = New DataTable

    adapter = New MySqlDataAdapter("select picture from [yourtable]", conn)

请注意!只能将一次图片放在图片框中,所以这个查询只能为你返回一条记录

    commandbuild = New MySqlCommandBuilder(adapter)
    adapter.Fill(data)

    Dim lb() As Byte = data.Rows(0).Item("picture")
    Dim lstr As New System.IO.MemoryStream(lb)
    PbPicture.Image = Image.FromStream(lstr)
    PbPicture.SizeMode = PictureBoxSizeMode.StretchImage
    lstr.Close()

答案 1 :(得分:1)

好吧,当'Image.FromStream'期待System.IO.Stream

时,你试图强制转换MemoryStream类型

答案 2 :(得分:1)

我刚刚写了这段代码作为我对这个论坛的贡献的一部分,虽然不是会员但是很乐意提供帮助。 当您继续搜索记录而不是搜索一条记录并关闭应用程序以再次搜索时,此代码搜索多个记录及其相应的图像。此代码允许您搜索记录,清除字段输入搜索条件并再次搜索&试。

    If TextBox3.Text = "" Then ' This is the search field to be used it could be any field from your database that will match the value from the database. Either firstname, phone or email etc
        MsgBox("Nothing to search for from the database", MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation, "Oop!")
    End If
    Try
        conn.Open()
        Dim data As New MySqlDataAdapter("SELECT * FROM users_data WHERE phoneno = '" & TextBox3.Text & "' ", conn)

        Dim dTable As New DataTable
        data.Fill(dTable)

        If dTable.Rows.Count > 0 Then
            TextBox1.Text = dTable.Rows(0).Item("firstname")
            TextBox2.Text = dTable.Rows(0).Item("lastname")

            'Fetching the corresponding image to this member
            Dim arrImage As Byte()
            Dim myMS As New IO.MemoryStream
            If Not IsDBNull(dTable.Rows(0).Item("myimage")) Then
                arrImage = dTable.Rows(0).Item("myimage")
                For Each ar As Byte In arrImage
                    myMS.WriteByte(ar)
                Next
                PictureBox1.Image = System.Drawing.Image.FromStream(myMS)
            End If

        Else
            MsgBox("No record found for this Phone No: " & TextBox3.Text & " Enter a valid Phone No or consult the Admin Manager", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "Record not found")
            clear()
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
        Exit Sub
    Finally
        conn.Close()
    End Try

此代码也适用于MYSQL Server数据库和Microsoft SQL数据库。唯一的区别是将此语句 Dim data As New MySqlDataAdapter 更改为 Dim data As New SqlDataAdapter 适用于Microsoft SQL Server。晚上好StackOverflowers

答案 3 :(得分:1)

VB.NET - 直接从Picturebox插入/检索来自MySQL数据库的图片

示例程序VISUAL BASIC。 NET 2017: 我正在分享:1°配置表MySQL和变量。 2°视觉设计3°代码。

程序概述:用户将图像放入图片框中。位于图片框中的imagen在MySQL表中是SAVED。另一个选项是给出图像的ID(textbox1.text),然后从MySQL表中加载图像。还有另一个按钮来清除图片框,但并非绝对必要。 它只是理解加载/保存到MySQL表格的图像流程并不是一个完美的程序。我和你分享我的知识。

  1. 在MySQL服务器中配置表。 例: 使用的表格:“imagenes” 变量:
  2. “idimagen”为INT。 (主键)

    “imagen”为LONGBLOB(允许空值)------->>>>图像的容器。

    Mysql表配置示例:
    Mysql table configuration example

    1. VB.NET设计
    2. 使用的设计形式:
      Designed form used

      1. 使用的代码:
      2. 添加引用:MySQL.data 6.10.5.0 您需要导入:MySql.Data.MySqlClient AND Imports System.IO

        Public Class Form1
        
        
        
         Dim Server As String = "XX.XX.XXX.XXX"
            Dim UserID As String = "XXXXXXXXXXXXXX"
            Dim Password As String = "PASSWORD"
            Dim Database As String = "DATABASE NAME"
            Dim Port As Integer = 3306
            Dim AllowUserVariables As Boolean = True
        
            Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        
                Dim ULTIMOID As Integer = 0
                Try
                    Dim xxxxcon As New MySqlConnectionStringBuilder()
                    xxxxcon.Database = Database
                    xxxxcon.Server = Server
                    xxxxcon.UserID = UserID
                    xxxxcon.Password = Password
                    xxxxcon.Port = 3306
                    xxxxcon.AllowUserVariables = True
                    Dim con As New MySqlConnection(xxxxcon.ToString)
                    Dim dbsql As String = "SELECT MAX(idimagen) AS 'ULTIMOID' FROM imagenes;"
                    Dim cmdMy As New MySqlCommand(dbsql, con)
                    con.Open()
                    cmdMy.ExecuteNonQuery()
                    Try
                        ULTIMOID = Convert.ToInt32(cmdMy.ExecuteScalar())
                    Catch ex As Exception
                        ULTIMOID = 0
                    End Try
                    con.Close()
                Catch ex As Exception
                    MsgBox("Problemas leyendo la BASE para obtener el último ID. Error: " & ex.Message)
                End Try
                       Try
                    Dim xxxxcon As New MySqlConnectionStringBuilder()
                    xxxxcon.Database = Database
                    xxxxcon.Server = Server
                    xxxxcon.UserID = UserID
                    xxxxcon.Password = Password
                    xxxxcon.Port = 3306
                    xxxxcon.AllowUserVariables = True
                    Dim FileSize As UInt32
                    Dim con As New MySqlConnection(xxxxcon.ToString)
                    Dim mstream As New System.IO.MemoryStream()
                    PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg)
                    Dim arrImage() As Byte = mstream.GetBuffer()
                    FileSize = mstream.Length
                    Dim sqlcmd As New MySqlCommand
                    Dim sql As String
                    mstream.Close()
                    sql = "insert into imagenes (idimagen, imagen) VALUES(@id, @imagen)"
                    Try
                        con.Open()
                        With sqlcmd
                            .CommandText = sql
                            .Connection = con
                            .Parameters.AddWithValue("@id", ULTIMOID + 1)
                            .Parameters.AddWithValue("@imagen", arrImage)
                            .ExecuteNonQuery()
                        End With
                    Catch ex As Exception
                        MsgBox(ex.Message)
                    Finally
                        con.Close()
                    End Try
        
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End Sub
        
            Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
                OpenFileDialog2.Filter = "image file (*.jpg, *.bmp, *.png) | *.jpg; *.bmp; *.png| all files (*.*) | *.* "
                If OpenFileDialog2.ShowDialog <> Windows.Forms.DialogResult.Cancel Then
                    PictureBox1.Image = Image.FromFile(OpenFileDialog2.FileName)
                End If
            End Sub
        
            Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
                PictureBox1.Image = Nothing
            End Sub
        
            Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
                Dim xxxxcon As New MySqlConnectionStringBuilder()
                xxxxcon.Database = Database
                xxxxcon.Server = Server
                xxxxcon.UserID = UserID
                xxxxcon.Password = Password
                xxxxcon.Port = 3306
                xxxxcon.AllowUserVariables = True
        
                Dim con As New MySqlConnection(xxxxcon.ToString)
                Try
                    Dim ds As New DataSet
        
                    Dim dbsql As String = "SELECT * FROM imagenes WHERE idimagen = " & TextBox1.Text & ";"
        
                    Dim cmdMy As New MySqlCommand(dbsql, con)
                    con.Open()
                    Dim da As New MySqlDataAdapter(dbsql, con)
                    da.Fill(ds, "Imagenes")
                    con.Close()
                    If ds.Tables("imagenes").Rows.Count > 0 Then
                        Dim bytes As [Byte]() = ds.Tables("imagenes").Rows(0).Item(1)
                        Dim ms As New MemoryStream(bytes)
                        PictureBox1.Image = Image.FromStream(ms)
                    Else
                        MsgBox("No record found for this Phone No: " & TextBox1.Text)
        
                    End If
                Catch ex As Exception
                    MsgBox(ex.Message)
                    Exit Sub
                End Try
            End Sub
        End Class
        

答案 4 :(得分:0)

如果你改变这种情况会发生什么:

Dim ad As New System.IO.MemoryStream(100000)

为:

Dim ad As New System.IO.MemoryStream()

修改

VB数组大小与其他编程语言不同,我认为你需要做一个减1:

rawData = New Byte(FileSize - 1) {}

编辑2

好的,让我们看一下原始二进制数据的内容。所有JPG应以FFD8开头,以FFD9结尾。设置rawData数组后插入以下内容。如果它抛出错误,那么您的JPEG信息就会损坏。

    If (rawData(0) = &HFF) AndAlso (rawData(1) = &HD8) Then
        Trace.WriteLine("File start OK")
    Else
        Throw New ApplicationException("Invalid jpg header")
    End If

    If (rawData(rawData.Length - 2) = &HFF) AndAlso (rawData(rawData.Length - 1) = &HD9) Then
        Trace.WriteLine("File end OK")
    Else
        Throw New ApplicationException("Invalid jpg footer")
    End If

编辑3

我们需要查看数据的前几个字节是什么样的。运行此并发布已经输出的内容:

    For I = 0 To 20
        Trace.Write(Convert.ToString(rawData(I), 16).ToUpperInvariant())
    Next