locked
[Tanya] cara menampilkan data Image dari Mysql ke picturebox Di VB.Net RRS feed

  • Pertanyaan

  • 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:tafa_rie@yahoo.com



    Minggu, 14 April 2013 08.17

Jawaban

  • 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


    Ahmad Masykur http://www.masykur.web.id/

    Rabu, 17 April 2013 01.43

Semua Balasan

  • Apakah baris berikut, program masuk ke blok While (nilai sql_reader.Read() = True)?

    While sql_reader.Read()
    
    Pastikan DataReader mengembalikan minimal satu record.

    Ahmad Masykur http://www.masykur.web.id/

    Senin, 15 April 2013 04.32
  • 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..


    Senin, 15 April 2013 04.56
  • 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

    Ahmad Masykur http://www.masykur.web.id/

    Senin, 15 April 2013 06.50
  • 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..




    Senin, 15 April 2013 10.12
  • 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.

    Ahmad Masykur http://www.masykur.web.id/

    Selasa, 16 April 2013 00.44
  • 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..

    Selasa, 16 April 2013 05.46
  • 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.


    Ahmad Masykur http://www.masykur.web.id/

    Selasa, 16 April 2013 06.02
  • 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..

    Selasa, 16 April 2013 13.30
  • 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


    Ahmad Masykur http://www.masykur.web.id/

    Rabu, 17 April 2013 01.43
  • terima kasih ahmad masykur karena sudah mau berusaha membantu saya...
    akan saya coba dulu code nya..

    nnti kl ada masalah, akan saya tanyakan kembali...

    Rabu, 17 April 2013 03.42