Link to home
Create AccountLog in
Avatar of AWestEng
AWestEngFlag for Sweden

asked on

Insert/Read a Image to MySQL BLOB from a picturebox

Hi

 I'm trying to fix the code so I can Insert a image from a picture box to a BLOB filed in my MySQL table
and also read the Image from the BLOB filed and put it back to the picturebox.

this is the code I have now, Need some help to fix it.


        Dim MySQLHandler As New SQL.MySQLDotNet.ExecuteNonQuery

        Dim FieldName As String = "Image"
        Dim QueryString As String = "UPDATE tbl_employed SET( " & FieldName & " ) = ( @" & FieldName & " ) WHERE EmpNr = '" & m_strEmployedNumber & "'"
        MySQLHandler.InsertImageToBLOB(QueryString, FieldName, PictureEditEmploy)
Public Function InsertImageToBLOB(ByVal QueryString As String, ByVal FieldName As String, ByVal PictureBox As DevExpress.XtraEditors.PictureEdit) As Integer
                Dim ms As MemoryStream = New MemoryStream       '// Create a new memory reader
                Dim bytBLOBData() As Byte                       '// Create a byte array to store picture
                Dim intBytes As Integer = 0                     '// Size of picture
                Dim iAffectedRows As Integer = 0                '// Number of affected rows
 
                Try
                    PictureBox.Image.Save(ms, ImageFormat.Jpeg) '// Get Image from picturebox
                    intBytes = CInt(ms.Length - 1)              '// Calulate byte size of image
                    ReDim bytBLOBData(intBytes)                 '// Set size if image byte array
                    ms.Position = 0                             '// Start position for reader
                    ms.Read(bytBLOBData, 0, CInt(ms.Length))    '// Read the image into the bytBLOBData variable
                    ms.Close()                                  '// Close reading stream
                Catch ex As Exception
                    Throw
                End Try
 
                '// The "Using" block will automatically dispose of the connection when we're finished
                Using MyConnectionMySQLOpen As New MySqlClient.MySqlConnection(m_strConnectionString)
 
                    Try
                        Dim prm As New MySql.Data.MySqlClient.MySqlParameter( _
                                    "@" & FieldName, _
                                    MySql.Data.MySqlClient.MySqlDbType.Blob, _
                                    bytBLOBData.Length, _
                                    ParameterDirection.Input, _
                                    False, 0, 0, Nothing, DataRowVersion.Current, bytBLOBData)
 
                        '// Open the DB connection
                        MyConnectionMySQLOpen.Open()
 
                        '// Create a new command object
                        Dim cmd As New MySqlClient.MySqlCommand()
 
                        '// Set command properties
                        With cmd
                            .Connection = MyConnectionMySQLOpen
                            .CommandType = CommandType.Text
                            .CommandText = QueryString
                            .Parameters.Add(prm)
                        End With
 
                        '// Execute the SQL query with the command object, and get the affected rows in the DB back
                        iAffectedRows = cmd.ExecuteNonQuery()
 
                        '// Close the connection
                        MyConnectionMySQLOpen.Close()
 
                    Catch MyException As MySqlException
                        Throw
                    Catch ex As Exception
                        Throw
                    Finally
                        '// Close connection if an exception was thrown before the connection could close
                        If MyConnectionMySQLOpen.State = ConnectionState.Open Then
                            MyConnectionMySQLOpen.Close()
                        End If
                    End Try
                End Using
 
                Return iAffectedRows
            End Function
 
 
          Public Function GetBLOBImage(ByVal TableName As String, ByVal FieldName As String) As Integer
                '// Create the SQL query
                Dim QueryString As String = "SELECT " & FieldName & " FROM " & TableName
                Dim iAffectedRows As Integer = 0                '// Number of affected rows
                Dim rawData() As Byte
                Dim FileSize As UInt32
                Dim fs As FileStream
 
                '// The "Using" block will automatically dispose of the connection when we're finished
                Using MyConnectionMySQLOpen As New MySqlClient.MySqlConnection(m_strConnectionString)
 
                    Try
                        '// Open the DB connection
                        MyConnectionMySQLOpen.Open()
 
                        '// Create a new command object
                        Dim cmd As New MySqlClient.MySqlCommand()
 
                        '// Set command properties
                        With cmd
                            .Connection = MyConnectionMySQLOpen
                            .CommandType = CommandType.Text
                            .CommandText = QueryString
                        End With
 
                        '// Execute the SQL query with the command object, and get the affected rows in the DB back
                        Dim myData As MySqlDataReader = cmd.ExecuteReader
 
                        '// Close the connection
                        MyConnectionMySQLOpen.Close()
 
                        If Not myData.HasRows Then Throw New Exception("There are no BLOBs data")
 
                        myData.Read()
 
                        FileSize = myData.GetUInt32(myData.GetOrdinal("file_size"))
                        rawData = New Byte(CInt(FileSize)) {}
 
                        myData.GetBytes(myData.GetOrdinal(FieldName), 0, rawData, 0, CInt(FileSize))
 
                        fs = New FileStream("C:\newfile.png", FileMode.OpenOrCreate, FileAccess.Write)
                        fs.Write(rawData, 0, CInt(FileSize))
                        fs.Close()
 
                    Catch MyException As MySqlException
                        Throw
                    Catch ex As Exception
                        Throw
                    Finally
                        '// Close connection if an exception was thrown before the connection could close
                        If MyConnectionMySQLOpen.State = ConnectionState.Open Then
                            MyConnectionMySQLOpen.Close()
                        End If
                    End Try
                End Using
 
                Return iAffectedRows
            End Function

Open in new window

Avatar of team2005
team2005

Hi!

Is this what you locking for
http://dev.mysql.com/doc/refman/5.0/en/blob.html

Avatar of AWestEng

ASKER

that's in C and not using the .Net connector so what I need help with is to "clean up" the code I have in the snippet above. thx anyway.
Hi!

Do you get any error message, or what is not working ?

The code above is more like "pseudo" code, so no it dosen't work yet. But the code is almost there. It should only need some smal fixing. But that's what I need help with.
the
PictureBox As DevExpress.XtraEditors.PictureEdit can be changed to
PictureBox As PictureBox
ASKER CERTIFIED SOLUTION
Avatar of AWestEng
AWestEng
Flag of Sweden image

Link to home
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
See answer