[Tanya] cara menampilkan data Image dari Mysql ke picturebox Di VB.Net-Collection of common programming errors

selamat sore master..

sebelumnya saya membuat program untuk menyimpan dan menampilkan foto dari database mysql,,
file yg disimpan kedalam database = .Jpeg dan .jpg

nah untuk field2 yang ada didatabase saya buat seperti ini :

===================================

Idfoto  int Not Null (Set Primary Key) Auto Increment

Nama  Varchar 150 Null

Foto MediumBlob Not Nul

===================================

dan desain form saya buat seperti ini :

setelah itu, saya ketik code untuk proses simpan dan menampilkan gambarnya kedalam picturebox, seperti ini :

Imports MySql.Data
Imports MySql.Data.MySqlClient
Imports System.IO

Public Class XtraForm1
Private conn As New MySqlClient.MySqlConnection
Private strSql As String = String.Empty
Dim sql_connection As MySqlClient.MySqlConnection = conn
Dim sql_command As MySqlClient.MySqlCommand
Dim sql_reader As MySqlClient.MySqlDataReader

Public Sub New()
InitializeComponent()
Dim strConn As String = "server=localhost;uid=mustafa;pwd=123asdf;database=testIQ;Port=3306"
conn.ConnectionString = strConn
conn.Open()

End Sub

Private Sub SaveGambar(ByVal namanya As String)
Dim cmd As New MySqlCommand
Dim FileSize As UInt32
Dim rawData() As Byte
Dim fs As FileStream

Try
fs = New FileStream(namanya, FileMode.Open, FileAccess.Read)
FileSize = fs.Length
rawData = New Byte(FileSize) {}
fs.Read(rawData, 0, FileSize)
fs.Close()
fs.Dispose()
cmd.Connection = conn
cmd.CommandText = "Insert into gambar (NAMA,FOTO) values (@nama,@File)"
cmd.Parameters.AddWithValue("@nama", namanya)
cmd.Parameters.AddWithValue("@File", rawData)
cmd.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show("error: " & ex.Message, "Error", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub

Private Sub LoadGambar(ByVal namanya As String)
Dim SQL As String
Try
Dim arrImage() As Byte
SQL = "SELECT FOTO FROM gambar where NAMA = '" + namanya + "' "
sql_command = New MySqlClient.MySqlCommand(SQL, sql_connection)
sql_reader = sql_command.ExecuteReader
While sql_reader.Read()
arrImage = sql_reader.Item("FOTO")
Dim mstream As New MemoryStream(arrImage)

'untuk menampilkan gambar dari database.....
PictureBox2.Image = Image.FromStream(mstream)
mstream.Close()

End While

sql_reader.Close()
Catch ex As Exception
MessageBox.Show("error: " & ex.Message, "Error", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
TextBox1.Text = OpenFileDialog1.FileName
TextBox2.Text = OpenFileDialog1.FileName

'untuk priview gambar yang akan disimpan kedalam database...
PictureBox1.Image = Image.FromFile(TextBox1.Text)
SaveGambar(TextBox1.Text)
MessageBox.Show("Data saved", "Info", MessageBoxButtons.OK)
End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
LoadGambar(TextBox1.Text)
End Sub

Setelah Saya Coba untuk simpan file gmbar kedalam database sudah berhasil.

namun saat saya Klik Tombol “Show” Untuk Menampilkan kembali dari DBase ke picturebox,, BELUM BISA, dan tidak terjadi perubahan apa2 pada picutrebox, serta pesan error juga TIDAK muncul,,

setelah saya cek di database, hasil dari penyimpanan gambar ke dalam tabel seperti ini (Saya Menggunakan Program Navicat for Mysql untuk menampilkan seperti gambar beikut) :

Nah, Yang ingin Saya Tanyakan Adalah :

1. Apakah Dari Kondisi tabel di mysql seperti gambar diatas, menandakan bahwa file gambar sudah tersimpan kedalam database atau belum.??

2. Untuk Proses Menampilkan gammbar kedalam picturebox, itu dimana salah nya ya..?????

3. atau ada cara lain yg memang khusus diterapkan di vb.net 2010..???
saya Menggunakan vb.net 2010, Mysql Conector Net 6.5.4 & DataBase Mysql dari Xampp. saya harap master2 skalian mau memberi pencerahan atas masalah yang saya jelaskan .. terima kasih…

by:[email protected]

  1. Berikut saya contohkan untuk membaca dua record berdasarkan kode Anda di atas

    Private Sub LoadGambar(ByVal nama1 As String, ByVal nama2 As String)
        Dim cmd As New MySqlCommand
        Dim ms As New MemoryStream
        Dim dr As MySqlDataReader
        Dim arrImage1() As Byte
        Dim arrImage2() As Byte
    
        cmd.Connection = conn
        cmd.CommandText = "Select Foto from gambar where NAMA=@nama1 Or NAMA=@nama2"
        cmd.Parameters.AddWithValue("@nama1", nama1)
        cmd.Parameters.AddWithValue("@nama2", nama2)
        dr = cmd.ExecuteReader
        ' Apakah ada record yang bisa dibaca?
        If dr.Read() Then 
            arrImage1 = dr("Foto")
        End If
        ' Apakah ada record berikutnya yang bisa dibaca?
        If dr.Read() Then 
            arrImage2 = dr("Foto")
        End If
        dr.Close()
    End Sub

    Untuk membaca banyak records bisa menggunakan perulangan

    While dr.Read()
        ' Baca data per record di sini
    End While

  2. terima kasih Ahmad Masykur  atas reply nya…

    apakah yang anda mksud coding nya dirubah jadi seperti ini :

                While sql_reader.Read()
                    If sql_reader.Read = True Then
                        arrImage = sql_reader.Item("FOTO")
                        Dim mstream As New MemoryStream(arrImage)
                        PictureBox2.Image = Image.FromStream(mstream)
                        mstream.Close()
                    Else
                        MessageBox.Show("Data Tidak Terbaca", "info", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                    End If
                End While

    dan juga saya coba codenya seperti ini :

                If sql_reader.HasRows Then
                    If sql_reader.Read Then
                        arrImage = sql_reader.Item("FOTO")
                        mstream = New MemoryStream(arrImage)
                        PictureBox2.Image = Image.FromStream(mstream)
                        mstream.Close()
                        MessageBox.Show("Data Tidak Terbaca", "info", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                    End If
                End If
                sql_reader.Close()

    saya sudh mencoba seperti code diatas, tapi hasilnya sma saja, fotonya tidak tampil…

    apakah ada yg salah dalam peng-codingan saya, atau ada cara lainnya.?

    terima kasih..

  3. Bukan begitu. Maksud saya apakah ada record yang dibaca? Coba contoh berikut

    If sql_reader.Read()    
        arrImage = sql_reader("FOTO")
        Dim mstream As New MemoryStream(arrImage)
        PictureBox2.Image = Image.FromStream(mstream)
        mstream.Close()
    Else
        MessageBox.Show("Data Tidak Terbaca", "info", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    End If
  4. terima kasih telah membantu,, Dan akhirnya saya bisa menampilkan gambarnya dari mysql ke picturebox,  Setelah saya rubah Query Sql nya dari :

    SELECT FOTO from gambar where Nama ='" & namanya & "'"

    menjadi seperti ini :

    SELECT FOTO from gambar where ID ='" & Idnya & "'"

    maka imagenya muncul di picturebox.

    yang ingin saya Tanyakan Kembali :

    1. kenapa kalau di SELECT berdasarkan nama dari foto tersebut tidak bisa,.??

    2. Dan juga kalau di SELECT FOTO from gambar Where ID=’1′ and ID=’2′,, juga tidak muncul

        datanya. ?

    saya coba query No.1 Dan 2, LANGSUNG di Mysql nya, hasil record yg terbaca  = NULL…

    kenapa bisa demikian.?

    terima kasih..

  5. Kalo query-nya pake parameter seperti command insert-nya bisa?

    SELECT FOTO from gambar where Nama = @nama

    Kemungkinan isi variabel yang dimasukkan memang tidak sama dengan isi field.

  6. saya sudah coba dan ternyata bisa tampil fotonya….

    kemudian saya coba untuk menampilkan 2 foto sekaligus dari database, dengan menambahkan querynya seperti ini :

    SELECT FOTO from gambar where Nama=@nama1 And Nama=@nama2

    untuk code nya seperti ini :

    kode simpan = Masih sama dengan yang diatas (Private Sub SaveGambar).

    code pada button BrowseAndSave :

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            With OpenFileDialog1
                .InitialDirectory = "E:\foto"
            End With
    
            If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
                If TextBox1.Text = "" Then
                    TextBox1.Text = OpenFileDialog1.FileName
                    PictureBox1.Image = Image.FromFile(TextBox1.Text)
                    SaveGambar(TextBox1.Text)
                Else
                    TextBox4.Text = OpenFileDialog1.FileName
                    PictureBox1.Image = Image.FromFile(TextBox4.Text)
                    SaveGambar(TextBox4.Text)
                End If
                MessageBox.Show("Data Sudah Disimpan", "Info", MessageBoxButtons.OK)
            End If
        End Sub

    untuk Load Gambarnya :

        Private Sub LoadGambar(ByVal nama1 As String, ByVal nama2 As String)
            Dim cmd As New MySqlCommand
            Dim ms As New MemoryStream
            Dim dr As MySqlDataReader
            Dim arrImage1() As Byte
            Dim arrImage2() As Byte
    
            cmd.Connection = conn
            cmd.CommandText = "Select Foto from gambar where NAMA=@nama1 Or NAMA=@nama2"
            cmd.Parameters.AddWithValue("@nama1", nama1)
            cmd.Parameters.AddWithValue("@nama2", nama2)
            dr = cmd.ExecuteReader
    
            If dr.HasRows Then
                If dr.Read() Then
                    'tampilan foto 1
                    arrImage1 = dr.Item("FOTO")
                    Dim mstream1 As New MemoryStream(arrImage1)
                    With PictureBox2
                        .Image = Image.FromStream(mstream1)
                        .SizeMode = PictureBoxSizeMode.StretchImage
                    End With
                    mstream1.Close()
    
                    'tampilan foto 2
                    arrImage2 = dr.Item("FOTO")
                    Dim mstream2 As New MemoryStream(arrImage2)
                    With PictureBox2
                        .Image = Image.FromStream(mstream2)
                        .SizeMode = PictureBoxSizeMode.StretchImage
                    End With
                    mstream2.Close()
                End If
            End If
            dr.Close()
        End Sub

    di button Shownya, Saya Panggil code nya seperti ini :

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            'Textboxt1 = Namafoto1 ; Textboxt4 = = Namafoto2
            loadgbr(TextBox1.Text, TextBox4.Text)
    End Sub

    namun yang tampil hanya Foto Yang Ke 1. seperti ini :

    Padahal saya sudah coba querynya di mysql nya. dan hasilnya 2 record :

    itu dimana ya salahnya..??

    kalau dilihat dari kode untuk Loadgambarnya, gk ada errornya..

    terima kasih..

  7. Itu gambar tidak berasal dari database tetapi dari kode saat menyimpan.

    Query Anda di aplikasi tidak menghasilkan records satu pun (0 records). Query yang anda tulis antara aplikasi dengan di MySQL berbeda. Silakan periksa kembali query Anda.

  8. jadi kalau mau ambil record pertama dan kedua dari tabel bagaimana caranya ya.?

    kode yang ini :


    dr.Item("FOTO")

    ingin saya rubah menjadi :


    dr.rows(0).Item("FOTO") 'untuk mengambil record pertama
    dr.rows(1).Item("FOTO") 'untuk mengambil record kedua

    tapi tidak bisa,, dan muncul error…

    mohon diberi solusinya ya…

    terima kasih..

  9. Berikut saya contohkan untuk membaca dua record berdasarkan kode Anda di atas

    Private Sub LoadGambar(ByVal nama1 As String, ByVal nama2 As String)
        Dim cmd As New MySqlCommand
        Dim ms As New MemoryStream
        Dim dr As MySqlDataReader
        Dim arrImage1() As Byte
        Dim arrImage2() As Byte
    
        cmd.Connection = conn
        cmd.CommandText = "Select Foto from gambar where NAMA=@nama1 Or NAMA=@nama2"
        cmd.Parameters.AddWithValue("@nama1", nama1)
        cmd.Parameters.AddWithValue("@nama2", nama2)
        dr = cmd.ExecuteReader
        ' Apakah ada record yang bisa dibaca?
        If dr.Read() Then 
            arrImage1 = dr("Foto")
        End If
        ' Apakah ada record berikutnya yang bisa dibaca?
        If dr.Read() Then 
            arrImage2 = dr("Foto")
        End If
        dr.Close()
    End Sub

    Untuk membaca banyak records bisa menggunakan perulangan

    While dr.Read()
        ' Baca data per record di sini
    End While

  10. terima kasih ahmad masykur karena sudah mau berusaha membantu saya…
    akan saya coba dulu code nya..

    nnti kl ada masalah, akan saya tanyakan kembali…