SQL Server image 資料類型可儲存二進位大型物件 (BLOB),常用於儲存圖片、文件。本文提供完整的資料表結構、C# WinForms 程式碼示範如何將圖片寫入資料庫並讀取顯示。
CREATE DATABASE EzoneDb;
GO
USE EzoneDb;
GO
CREATE TABLE [Images] (
[ImageID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Description] [nvarchar](100) NULL,
[ImageFile] [image] NULL,
[ImageSize] [int] NULL,
[ImageType] [nvarchar](100) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY];
GO
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
public class ImageManager
{
private readonly string _connStr = "Data Source=.;Initial Catalog=EzoneDb;User ID=sa;Password=;";
// 儲存圖片
public void SaveImage(string description, string filePath)
{
byte[] imageData = File.ReadAllBytes(filePath);
string mimeType = GetMimeType(Path.GetExtension(filePath));
using (SqlConnection conn = new SqlConnection(_connStr))
using (SqlCommand cmd = new SqlCommand(
"INSERT INTO Images (Description, ImageFile, ImageSize, ImageType) VALUES (@Desc, @Img, @Size, @Type)", conn))
{
cmd.Parameters.AddWithValue("@Desc", description);
cmd.Parameters.AddWithValue("@Img", imageData);
cmd.Parameters.AddWithValue("@Size", imageData.Length);
cmd.Parameters.AddWithValue("@Type", mimeType);
conn.Open();
cmd.ExecuteNonQuery();
}
}
// 讀取圖片並回傳 Image 物件
public Image LoadImage(int imageId)
{
using (SqlConnection conn = new SqlConnection(_connStr))
using (SqlCommand cmd = new SqlCommand(
"SELECT ImageFile, ImageType FROM Images WHERE ImageID = @Id", conn))
{
cmd.Parameters.AddWithValue("@Id", imageId);
conn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
byte[] imgBytes = (byte[])reader["ImageFile"];
using (MemoryStream ms = new MemoryStream(imgBytes))
{
return Image.FromStream(ms);
}
}
}
}
return null;
}
private string GetMimeType(string ext)
{
switch (ext.ToLower())
{
case ".jpg": case ".jpeg": return "image/jpeg";
case ".png": return "image/png";
case ".gif": return "image/gif";
case ".bmp": return "image/bmp";
default: return "application/octet-stream";
}
}
}
var mgr = new ImageManager();
// 存圖
mgr.SaveImage("產品照片", @"C:\Photos\product.jpg");
// 取圖並顯示於 PictureBox
pictureBox1.Image = mgr.LoadImage(1);
image 類型在 SQL Server 2005+ 已被 varbinary(max) 取代,新專案建議使用後者。FILESTREAM 或檔案系統儲存路徑,資料庫僅存路徑。