文章編號: 317701 - 上次校閱: 2004年4月5日 - 版次: 2.5

如何: 將圖片複製從資料庫直接到 PictureBox 控制項與 Visual C#

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

本文將逐步告訴您,如何將複製圖像不需要將影像儲存至檔案儲存在資料庫中直接至 Windows Form 的 PictureBox 控制項。

在 Microsoft Visual Basic 6.0 唯一的方式而不儲存二進位大型物件的中間步驟的 PictureBox 控制項中顯示從資料庫影像 {BLOB) 資料到一個檔案是要將 PictureBox 繫結至資料來源,例如 ActiveX 資料物件 (ADO) 資料控制或資料錄集。以程式設計方式將 BLOB 載入到控制項而不儲存影像 LoadPicture 陳述式所使用的檔案沒有任何方法 (不含資料繫結)。

本文章中我們將使用 MemoryStream 物件從 System.IO 基底類別來將圖像資料從資料庫複製直接將 PictureBox 控制項。


需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及您需要的服務套件:
  • Microsoft Visual Studio.NET] 安裝在相容的 Microsoft Windows 作業系統上
  • 可以使用 Microsoft SQL Server 或可以使用 Microsoft Access 資料庫中的進行測試的執行個體
本文假設您已熟悉下列主題:
  • Visual C#.NET Windows Form 應用程式
  • 二進位大型物件 (BLOB) 儲存在資料庫中
  • ADO.NET 資料存取

範例

  1. 建立 SQL Server 或 Access 資料表具有下列結構:
    CREATE TABLE BLOBTest
    (
    BLOBID INT IDENTITY NOT NULL,
    BLOBData IMAGE NOT NULL
    )
    					
  2. 開啟 Visual Studio.NET 並建立一個新 Visual C# Windows 應用程式專案。
  3. PictureBox 和兩個 按鈕 控制項加入至 Form1 預設從工具箱。將 Button1 的 Text 屬性設定為 要資料庫的檔案,而 Button2 PictureBox 的資料庫 將 [文字] 屬性。
  4. 在表單的程式碼模組的上方插入下列 using 陳述式:
    using System.Data.SqlClient;
    using System.IO;
    using System.Drawing.Imaging;
    					
  5. 只是內部加入下列宣告資料庫連接字串 公用類別 Form1: System.Windows.Forms.Form 類別宣告,並調整連接字串所需:
        String strCn = "Data Source=localhost;integrated security=sspi;initial catalog=mydata";
    					
  6. 下列程式碼插入 Click 事件程序的 Button1 中 ([檔案],以資料庫)。調整視可用的範例影像檔檔案路徑。這個程式碼會讀取到 位元組 陣列的影像檔案從磁碟 (使用 FileStream 物件),然後將插入資料資料庫使用參數化的 命令 物件
    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. 下列程式碼插入 Click 事件程序的 Button2 中 (資料庫 PictureBox)。這個程式碼從資料庫中 BLOBTest 資料表擷取資料列到 資料集、 最近新增的複本影像到 位元組 陣列,然後再到 MemoryStream 物件,然後載入 MemoryStreamPictureBox 控制項的 [影像] 屬性
    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. 請按 F5 編譯並執行專案。
  9. 按一下 到資料庫的檔案] 按鈕,將至少一個樣本影像載入資料庫。
  10. 按一下 資料庫 PictureBox] 按鈕,在 PictureBox 控制項中顯示已儲存的影像。
  11. 如果要能夠從 PictureBox 控制項插入圖像時,直接在資料庫,新增第三個 按鈕] 控制項,再在其 Click 事件程序中插入下列程式碼。這段程式碼從 PictureBox 控制項擷取影像資料,到 MemoryStream 物件、 MemoryStream 複製到 位元組 陣列,並再將 位元組 陣列儲存至資料庫使用參數化的 命令 物件
    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. 執行專案。按一下 資料庫 PictureBox] 按鈕,在 PictureBox 控制項中顯示先前儲存的圖像。按一下新加入的按鈕,將圖像從 PictureBox 儲存到資料庫。然後按一下 [資料庫 PictureBox] 按鈕來確認已正確地儲存影像。

陷阱

  • 這項測試無法與範例 北風 資料庫與存取] 和 [SQL Server 一同散發的 員工 資料表中的 [相片] 資料行。儲存在 [相片] 資料行的點陣圖影像被包起來以 Visual Basic 6.0 OLE 容器控制項所建立的標頭資訊。
  • 如果需要使用 Access 資料庫來測試此程式碼必須在 Access 資料表中建立資料行,為 OLE 物件,類型並 System.Data.OleDb 命名空間使用 Microsoft Jet 4.0 提供者 System.Data.SqlClient 命名空間的位置。

?考

如其他有關使用 Visual C#.NET 中的 BLOB 資料的資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件:
309158? (http://support.microsoft.com/kb/309158/ ) 如何: 讀取與寫入 BLOB 資料使用 ADO.NET 使用 Visual C#.NET
317016? (http://support.microsoft.com/kb/317016/ ) 如何讀取及寫入藉由使用 ADO.NET 和 Visual C#.NET 檔案至或從 BLOB 資料行

這篇文章中的資訊適用於:
  • 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 標準版
關鍵字:?
kbmt kbdatabinding kbhowtomaster KB317701 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:317701? (http://support.microsoft.com/kb/317701/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。