首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

使用 ADO.NET 在 C# 中讀寫 BLOB 資料完整指南

     編輯:關於C語言

前言

在 ADO.NET 架構中,DataReader、DataSet 或 Command 參數均不支援傳統的 GetChunk 和 AppendChunk 方法來處理二進位大型物件(BLOB)。本文將示範如何使用 Visual C# .NET 配合 System.Data.SqlClient 與 System.IO 命名空間,實作將二進位檔案(如圖片)寫入 SQL Server image 欄位,以及從資料庫讀取並還原成檔案的完整流程。

環境需求

  • 作業系統:Windows 2000 Professional / Server / Advanced Server 或 Windows NT 4.0 Server
  • 開發工具:Microsoft Visual Studio .NET
  • 資料庫:Microsoft SQL Server

資料庫準備

在 Northwind 範例資料庫中建立 MyImages 資料表,欄位定義如下:

欄位名稱資料類型說明
IDint識別欄位(自動遞增)
Descriptionvarchar(50)圖片描述文字
ImgFieldimage儲存二進位圖片資料

建立 Windows Forms 專案

  1. 啟動 Visual Studio .NET,新建「Visual C# Windows 應用程式」專案。
  2. 在預設表單 Form1 上拖曳兩個 Button 控制項。
  3. 設定按鈕屬性:
    • Button1.Text = 「存入資料庫(從檔案)」
    • Button2.Text = 「存成檔案(從資料庫)」
  4. 在程式碼視窗頂端加入必要命名空間:
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();
}

執行與驗證

  1. 按 F5 編譯並執行應用程式。
  2. 點擊「存入資料庫(從檔案)」,將 C:\WinNT\Gone Fishing.bmp 寫入資料庫。
  3. 點擊「存成檔案(從資料庫)」,將資料庫中的二進位資料還原為 Gone Fishing2.bmp。
  4. 以圖片檢視器開啟產出的檔案,確認內容完整無誤。

重點提示

  • 實務上建議使用 using 區塊自動處理 SqlConnection、FileStream 等實作 IDisposable 的物件釋放。
  • 大型 BLOB 檔案建議採用 SqlCommand.ExecuteNonQuery 搭配參數化查詢,避免將整個 DataSet 載入記憶體。
  • SQL Server 2005 之後推薦使用 varbinary(max) 取代已淘汰的 image 型別。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved