在 ADO.NET 架構中,DataReader、DataSet 或 Command 參數均不支援傳統的 GetChunk 和 AppendChunk 方法來處理二進位大型物件(BLOB)。本文將示範如何使用 Visual C# .NET 配合 System.Data.SqlClient 與 System.IO 命名空間,實作將二進位檔案(如圖片)寫入 SQL Server image 欄位,以及從資料庫讀取並還原成檔案的完整流程。
在 Northwind 範例資料庫中建立 MyImages 資料表,欄位定義如下:
| 欄位名稱 | 資料類型 | 說明 |
|---|---|---|
| ID | int | 識別欄位(自動遞增) |
| Description | varchar(50) | 圖片描述文字 |
| ImgField | image | 儲存二進位圖片資料 |
Form1 上拖曳兩個 Button 控制項。Button1.Text = 「存入資料庫(從檔案)」Button2.Text = 「存成檔案(從資料庫)」using System.Data;
using System.Data.SqlClient;
using System.IO;
雙擊 Button1,在 Click 事件中撰寫以下程式碼:
private void Button1_Click(object sender, EventArgs e)
{
// 1. 建立資料庫連線(請依實際環境修改連線字串)
SqlConnection conn = new SqlConnection(
"Server=Darkover;uid=sa;pwd=PassWord1;database=northwind");
// 2. 設定 DataAdapter 與 CommandBuilder
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM MyImages", conn);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
DataSet ds = new DataSet("MyImages");
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
// 3. 讀取本機圖片檔案為位元組陣列
FileStream fs = new FileStream(@"C:\winnt\Gone Fishing.bmp",
FileMode.Open, FileAccess.Read);
byte[] imgData = new byte[fs.Length];
fs.Read(imgData, 0, (int)fs.Length);
fs.Close();
// 4. 填充 DataSet 並新增資料列
da.Fill(ds, "MyImages");
DataRow newRow = ds.Tables["MyImages"].NewRow();
newRow["Description"] = "範例圖片描述文字";
newRow["ImgField"] = imgData;
ds.Tables["MyImages"].Rows.Add(newRow);
// 5. 更新資料庫並關閉連線
da.Update(ds, "MyImages");
conn.Close();
}
雙擊 Button2,在 Click 事件中撰寫以下程式碼:
private void Button2_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(
"Server=Darkover;uid=sa;pwd=PassWord1;database=northwind");
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM MyImages", conn);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
DataSet ds = new DataSet("MyImages");
da.Fill(ds, "MyImages");
// 取得第一筆資料的二進位欄位
DataRow row = ds.Tables["MyImages"].Rows[0];
byte[] imgData = (byte[])row["ImgField"];
// 寫入檔案
FileStream fs = new FileStream(@"C:\winnt\Gone Fishing2.bmp",
FileMode.Create, FileAccess.Write);
fs.Write(imgData, 0, imgData.Length);
fs.Close();
conn.Close();
}
C:\WinNT\Gone Fishing.bmp 寫入資料庫。Gone Fishing2.bmp。using 區塊自動處理 SqlConnection、FileStream 等實作 IDisposable 的物件釋放。SqlCommand.ExecuteNonQuery 搭配參數化查詢,避免將整個 DataSet 載入記憶體。varbinary(max) 取代已淘汰的 image 型別。