ID Artikel: 317701 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0

CARA: Menyalin gambar dari Database secara langsung ke kontrol PictureBox dengan Visual C#

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

Artikel ini selangkah demi selangkah menjelaskan bagaimana untuk menyalin gambar yang disimpan dalam database langsung ke PictureBox kontrol pada formulir Windows tanpa perlu menyimpan foto ke sebuah file.

Di Microsoft Visual Basic 6.0, satu-satunya cara untuk menampilkan gambar dari database di PictureBox kontrol, tanpa langkah antara menyelamatkan biner objek besar {GUMPALAN) data ke file, adalah untuk mengikat PictureBox untuk sumber data seperti objek Data ActiveX (ADO) Data Control atau Recordset. Tidak ada cara (tanpa data binding) untuk pemrograman memuat GUMPALAN ke kontrol tanpa menyimpan gambar ke file untuk digunakan oleh pernyataan LoadPicture.

Dalam artikel ini, kita akan menggunakan MemoryStream objek dari System.io dasar kelas untuk menyalin data gambar dari database langsung ke PictureBox kontrol.


Persyaratan

Daftar berikut menguraikan fitur perangkat keras, perangkat lunak, jaringan infrastruktur, dan paket layanan yang akan Anda perlukan:
  • Microsoft Visual Studio.NET yang diinstal pada sistem operasi Microsoft Windows yang kompatibel
  • Contoh tersedia dari Microsoft SQL Server atau database Microsoft Access tersedia untuk pengujian
Artikel ini mengasumsikan bahwa Anda sudah familiar dengan topik-topik berikut:
  • Visual C#.Aplikasi NET Windows Forms
  • Objek besar biner (GUMPALAN) penyimpanan dalam database
  • ADO.Mengakses data bersih

Sampel

  1. Membuat tabel SQL Server atau akses dengan struktur berikut:
    CREATE TABLE BLOBTest
    (
    BLOBID INT IDENTITY NOT NULL,
    BLOBData IMAGE NOT NULL
    )
    					
  2. Membuka Visual Studio.NET dan menciptakan Visual C# Windows aplikasi proyek baru.
  3. Tambahkan PictureBox dan dua Tombol kontrol ke default Form1 dari toolbox. Menetapkan Teks properti Button1 untuk File Database dan Teks properti Button2 untuk Database untuk PictureBox.
  4. Masukkan berikut ini menggunakan pernyataan di atas kode Formulir modul:
    using System.Data.SqlClient;
    using System.IO;
    using System.Drawing.Imaging;
    					
  5. Tambah deklarasi berikut untuk string koneksi database hanya dalam public class Form1: System.Windows.Forms.Form kelas Deklarasi dan menyesuaikan rangkaian sambungan yang diperlukan:
        String strCn = "Data Source=localhost;integrated security=sspi;initial catalog=mydata";
    					
  6. Masukkan kode berikut dalam prosedur acara klik Button1)File Database). Menyesuaikan path file untuk file gambar sampel tersedia jika diperlukan. Kode ini membaca file gambar dari disk (menggunakan FileStream objek) ke Byte array, dan kemudian memasukkan data ke dalam database dengan menggunakan parameterized Perintah objek.
    try
    {
    	SqlConnection cn = new SqlConnection(strCn);
    	SqlCommand cmd =  new SqlCommand("INSERT INTO BLOBTest (BLOBData) VALUES (@BLOBData)", cn);
    	String strBLOBFilePath = @"C:\blue hills.jpg";//Modify this path as needed.
    
    	//Read jpg into file stream, and from there into Byte array.
    	FileStream fsBLOBFile =  new FileStream(strBLOBFilePath,FileMode.Open, FileAccess.Read);
    	Byte[] bytBLOBData = new Byte[fsBLOBFile.Length]; 
    	fsBLOBFile.Read(bytBLOBData, 0, bytBLOBData.Length);
    	fsBLOBFile.Close();
    
    	//Create parameter for insert command and add to SqlCommand object.
    	SqlParameter prm = new  SqlParameter("@BLOBData", SqlDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 
    				0, 0, null, DataRowVersion.Current, bytBLOBData);
    	cmd.Parameters.Add(prm);
    
    	//Open connection, execute query, and close connection.
    	cn.Open();
    	cmd.ExecuteNonQuery();
    	cn.Close();
    }catch(Exception ex)
    {MessageBox.Show(ex.Message);}
    					
  7. Masukkan kode berikut dalam prosedur acara klik Button2)Database untuk PictureBox). Kode ini mengambil baris dari BLOBTest tabel dalam database ke dalam DataSet, salinan yang paling baru-baru ini menambahkan gambar ke Byte array dan kemudian ke MemoryStream objek, dan kemudian beban MemoryStream ke Gambar properti PictureBox kontrol.
    try
    {
    	SqlConnection cn = new SqlConnection(strCn);
    	cn.Open();
    
    	//Retrieve BLOB from database into DataSet.
    	SqlCommand cmd = new SqlCommand("SELECT BLOBID, BLOBData FROM BLOBTest ORDER BY BLOBID", cn);	
    	SqlDataAdapter da = new SqlDataAdapter(cmd);
    	DataSet ds = new DataSet();
    	da.Fill(ds, "BLOBTest");
    	int c = ds.Tables["BLOBTest"].Rows.Count;
    
    	if(c>0)
    	{   //BLOB is read into Byte array, then used to construct MemoryStream,
    		//then passed to PictureBox.
    		Byte[] byteBLOBData =  new Byte[0];
    		byteBLOBData = (Byte[])(ds.Tables["BLOBTest"].Rows[c - 1]["BLOBData"]);
    		MemoryStream stmBLOBData = new MemoryStream(byteBLOBData);
    		pictureBox1.Image= Image.FromStream(stmBLOBData);
    	} 
    	cn.Close();
    }
    catch(Exception ex)
    {MessageBox.Show(ex.Message);}
    					
  8. Tekan F5 untuk mengkompilasi dan menjalankan proyek.
  9. Klik File Database tombol untuk memuat gambar sampel yang satu ke dalam database.
  10. Klik Database untuk PictureBox tombol untuk menampilkan gambar yang disimpan di PictureBox kontrol.
  11. Jika Anda ingin untuk dapat menyisipkan gambar dari PictureBox kontrol langsung ke dalam database, menambahkan ketiga Tombol kontrol dan masukkan kode berikut dalam prosedur acara klik. Kode ini akan mengambil data gambar dari PictureBox kontrol ke MemoryStream objek, salinan MemoryStream ke Byte array, dan kemudian menyimpan Byte array ke database menggunakan parameterized Perintah objek.
    try
    {
    	SqlConnection cn = new SqlConnection(strCn);
    	SqlCommand cmd = new SqlCommand("INSERT INTO BLOBTest (BLOBData) VALUES (@BLOBData)", cn);
    
    	//Save image from PictureBox into MemoryStream object.
    	MemoryStream ms  = new MemoryStream();
    	pictureBox1.Image.Save(ms, ImageFormat.Jpeg);
    
    	//Read from MemoryStream into Byte array.
    	Byte[] bytBLOBData = new Byte[ms.Length];
    	ms.Position = 0;
    	ms.Read(bytBLOBData, 0, Convert.ToInt32(ms.Length));
    
    	//Create parameter for insert statement that contains image.
    	SqlParameter prm = new SqlParameter("@BLOBData", SqlDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 
    					0, 0,null, DataRowVersion.Current, bytBLOBData);
    	cmd.Parameters.Add(prm);
    	cn.Open();
    	cmd.ExecuteNonQuery();
    	cn.Close();
    }catch(Exception  ex)
     {MessageBox.Show(ex.Message);}
    					
  12. Menjalankan proyek. Klik Database untuk PictureBox tombol untuk menampilkan gambar yang sebelumnya telah disimpan di PictureBox kontrol. Klik tombol baru ditambahkan untuk menyimpan gambar dari PictureBox ke dalam database. Kemudian klik Database untuk PictureBox tombol lagi untuk mengkonfirmasi bahwa gambar disimpan dengan benar.

Perangkap

  • Tes ini tidak akan bekerja dengan Foto kolom di Karyawan Tabel sampel Northwind database didistribusikan dengan Access dan SQL Server. Gambar bitmap disimpan dalam Foto kolom dibungkus dengan informasi header yang dibuat oleh kontrol Visual Basic 6.0 OLE wadah.
  • Jika Anda perlu untuk menggunakan akses database untuk menguji kode ini, Anda akan perlu untuk membuat kolom dalam tabel akses sebagai jenis OLE objek, dan menggunakan System.data.OleDb namespace dengan Microsoft Jet 4.0 penyedia di tempat System.data.SqlClient namespace.

REFERENSI

Untuk informasi tambahan tentang penggunaan BLOB data dengan Visual C#.NET, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
309158  (http://support.microsoft.com/kb/309158/ ) Bagaimana: Membaca dan menulis BLOB data dengan menggunakan ADO.NET dengan Visual C#.NET
317016  (http://support.microsoft.com/kb/317016/ ) Bagaimana untuk membaca dan menulis file ke atau dari kolom GUMPALAN dengan menggunakan ADO.NET dan Visual C#.NET

Berlaku bagi:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Kata kunci: 
kbdatabinding kbhowtomaster kbmt KB317701 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:317701  (http://support.microsoft.com/kb/317701/en-us/ )