Makale numarası: 317701 - Son Gözden Geçirme: 05 Nisan 2004 Pazartesi - Gözden geçirme: 2.5

NASıL YAPıLıR: doğrudan bir PictureBox denetimiyle Visual C# resim bir veritabanından Kopyala

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Bu adım adım makalede, bir dosyaya kaydetmek gerek kalmadan Windows Form PictureBox denetime doğrudan veritabanında depolanan resim kopyalama açıklamaktadır.

Microsoft Visual Basic 6. 0'ın, büyük ikili nesne kaydetmenin bir ara adım olmadan PictureBox denetimindeki bir veritabanından bir resim görüntülemek için tek yol, {BLOB) bir dosyaya PictureBox ActiveX Data Objects (ADO) veri denetimi veya Recordset gibi bir veri kaynağına bağlamak için veridir. Programsal olarak kullanılacak bir dosyaya resim LoadPicture beyannamenin kaydetmeden bir BLOB denetime yüklenemedi (veri bağlama) olmadan bir yolu yoktur.

Bu makalede, System.ıo temel sınıf MemoryStream nesneden resim verileri veritabanından PictureBox denetime kopyalamak için çaba göstereceğiz.


Gereksinimler

Aşağıdaki listede önerilen donanım, yazılım, ağ altyapısı ve gereken hizmet paketleri önerilmektedir:
  • Microsoft Visual Studio uyumlu bir Microsoft Windows işletim sistemi üzerine yüklenmiş .NET
  • Kullanılabilir Microsoft SQL Server'ı veya sınamak için kullanılabilir bir Microsoft Access veritabanı örneği
Bu makalede, aşağıdaki konularda bilgi sahibi olduğunuz varsayılmaktadır:
  • Visual C# .NET Windows Forms uygulamaları
  • Büyük ikili nesne (BLOB) depolama veritabanlarındaki
  • ADO.NET veri erişimi

ÖRNEK

  1. Aşağıdaki yapıda bir SQL Server veya Access tablo oluşturun:
    CREATE TABLE BLOBTest
    (
    BLOBID INT IDENTITY NOT NULL,
    BLOBData IMAGE NOT NULL
    )
    					
  2. Visual Studio. NET'i açın ve bir yeni Visual C# Windows uygulaması projesi oluşturun.
  3. Form1 varsayılan araç kutusundan, bir PictureBox ve iki Düğme denetimi ekleyin. Metin özelliği Button1, veritabanı dosyasına BUTTON2 PictureBox veritabanına için <a1>Text</a1> özelliğini ayarlayın.
  4. Aşağıdaki ifadeleri kullanarak kod modülü formun üstündeki Ekle:
    using System.Data.SqlClient;
    using System.IO;
    using System.Drawing.Imaging;
    					
  5. Veritabanı bağlantı dizesi aşağıdaki bildirimi yalnızca içinde ekleme Genel sınıf Form1: System.Windows.Forms.Form bildirimi sınıfının ve bağlantı dizesi gerektiği şekilde ayarlayın:
        String strCn = "Data Source=localhost;integrated security=sspi;initial catalog=mydata";
    					
  6. Button1 Tıklat olay yordamını aşağıdaki kodu ekleyin (veritabanı dosyası). Gerektiği gibi kullanılabilir örnek görüntü dosyası için dosya yolunu ayarlama. Bu kod, bir bayt dizisi (bir FileStream nesnesi kullanarak) bir disk görüntü dosyasından okur ve parametreli bir Command nesnesi kullanarak veri veritabanına ekler.
    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. BUTTON2 Tıklat olay yordamını aşağıdaki kodu ekleyin (PictureBox veritabanına). Bu kod satırları bir DataSet içinde veritabanındaki <a1>BLOBTest</a1> tablosundan alır, en son eklenen kopya bir bayt dizisi ve sonra bir MemoryStream nesneyi ve sonra yükleri MemoryStreamPictureBox denetimin Resim özelliği görüntü.
    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. Derlemek ve proje çalıştırmak için F5 tuşuna basın.
  9. En az bir örnek resim veritabanına yüklemek için veritabanı dosyasına düğmesini tıklatın.
  10. Kaydedilen görüntü PictureBox Denetimde görüntülenecek PictureBox veritabanına düğmesini tıklatın.
  11. PictureBox denetimden resim doğrudan veritabanına eklemek istediğiniz, üçüncü Düğme denetimi ekleyin ve Tıklat olay yordamında aşağıdaki kodu ekleyin. Bu kod, görüntü verileri PictureBox denetimden bir MemoryStream nesnesine alır, MemoryStreambaytlık bir dizi içine kopyalar ve ardından bayt dizisinin parametreli bir Command nesnesi kullanarak veritabanına kaydeder..
    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. Projeyi çalıştırın. PictureBox denetim içinde önceden kaydedilmiş bir resmi görüntülemek için veritabanı PictureBox düğmesini tıklatın. Veritabanına PictureBox kaydetmek için yeni eklenen düğmesini tıklatın. Sonra yeniden görüntü doğru olarak kaydedilmiş onaylamak için PictureBox veritabanına düğmesini tıklatın.

Tuzaklar

  • Bu sınama, Access ve SQL Server ile birlikte dağıtılan örnek Northwind veritabanı <a1>Çalışanlar</a1> tablosunda Fotoğraf sütun ile çalışmayacak. Bit eşlem resimler Fotoğraf sütunda depolanan, Visual Basic 6.0 OLE kapsayıcı denetimi tarafından oluşturulan üstbilgi bilgileri alınmış.
  • Bu kod sınamak için Access veritabanını kullanmak isterseniz, sütun Access tabloya OLE nesnesi türünde oluşturun ve System.Data.OLEDB ad System.Data.SqlClient ad yerine Microsoft Jet 4.0 sağlayıcısı ile gerekecektir.

Referanslar

BLOB verileri Visual C# .NET ile kullanma hakkında ek bilgi için Microsoft Knowledge Base'deki makaleleri görüntülemek üzere aşağıdaki makale numaralarını tıklatın:
309158  (http://support.microsoft.com/kb/309158/ ) NASıL YAPıLıR: Okuma ve Visual C# .NET ile ADO.NET kullanarak BLOB veri yazma
317016  (http://support.microsoft.com/kb/317016/ ) Nasıl okuyup bir dosya veya bir BLOB sütun için ADO.NET ve Visual C#. NET'i kullanarak

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Anahtar Kelimeler: 
kbmt kbdatabinding kbhowtomaster KB317701 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:317701  (http://support.microsoft.com/kb/317701/en-us/ )