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

C# 讀寫資料庫 Binary/BLOB 欄位:MemoryStream 完整實作範例

     編輯:關於C#

前言

資料庫 BLOB 欄位常用於儲存圖片、文件、RichText 等二進位資料。本文提供完整的 C# 範例,示範如何使用 OleDbCommand 搭配 MemoryStream 讀寫 BLOB,並處理 RichTextBox 的 RTF/純文字雙格式相容。

核心類別:DBClass


public class DBClass
{
    private OleDbConnection Conn;
    private OleDbCommand cmd;

    private void Db_Conn()
    {
        // 連線字串略,請依實際資料庫設定
        Conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb");
    }

    private void close()
    {
        if (Conn != null && Conn.State == ConnectionState.Open)
            Conn.Close();
    }

    /// 
    /// 讀取 BLOB 回傳 MemoryStream
    /// 
    public MemoryStream getBlob(string SQL)
    {
        try
        {
            Db_Conn();
            cmd = new OleDbCommand(SQL, Conn);
            cmd.CommandType = CommandType.Text;
            OleDbDataReader Rs = cmd.ExecuteReader();
            if (Rs.Read())
            {
                if (!(Rs.GetValue(0) is DBNull))
                {
                    byte[] image_bytes = (byte[])Rs.GetValue(0);
                    return new MemoryStream(image_bytes);
                }
            }
            return null;
        }
        finally
        {
            this.close();
        }
    }

    /// 
    /// 寫入 BLOB
    /// 
    public bool SetBlob(string SQL, MemoryStream Ms)
    {
        try
        {
            Db_Conn();
            cmd = new OleDbCommand(SQL, Conn);
            cmd.CommandType = CommandType.Text;
            int n = (int)Ms.Length;
            Ms.Position = 0;
            byte[] pReadByte = new byte[n];
            Ms.Read(pReadByte, 0, n);
            cmd.Parameters.Add("BLOB", OleDbType.Binary).Value = pReadByte;
            cmd.ExecuteNonQuery();
            return true;
        }
        catch (Exception ex)
        {
            MessageBox.Show("錯誤:因 " + ex.Message + ",無法執行:" + SQL);
            return false;
        }
        finally
        {
            this.close();
        }
    }
}

呼叫端範例:RichTextBox 讀寫

讀取並顯示


string sqlStr = "select content from dp where id=" + ID; // content 為 BLOB 欄位
MemoryStream ms = DBClass.getBlob(sqlStr);
if (ms == null || ms.Length == 0)
{
    richTextBox.Clear();
}
else
{
    ms.Position = 0;
    try
    {
        // 嘗試載入 RTF 格式
        richTextBox.LoadFile(ms, RichTextBoxStreamType.RichText);
    }
    catch
    {
        // 失敗則嘗試純文字
        ms.Position = 0;
        richTextBox.LoadFile(ms, RichTextBoxStreamType.PlainText);
    }
}

儲存編輯內容


string sqlStr = "update dp set content=:BLOB where id=" + ID;
MemoryStream ms = new MemoryStream();
// 存為 RTF 格式(保留格式)
richTextBox.SaveFile(ms, RichTextBoxStreamType.RichText);
if (!DBClass.SetBlob(sqlStr, ms))
{
    MessageBox.Show("儲存失敗");
}

關鍵技術點解析

  1. 參數化查詢:cmd.Parameters.Add("BLOB", OleDbType.Binary) 防止 SQL Injection 並正確傳遞二進位資料。
  2. MemoryStream 位置管理:讀寫前後務必 Position = 0,否則會從當前位置開始導致資料遺漏或覆寫錯誤。
  3. RichTextBox 雙格式相容:先嘗試 RTF,失敗再嘗試 PlainText,確保舊資料相容。
  4. 資源釋放:finally 區塊確保連線關閉,避免連線洩漏。

進階建議

  • 大型 BLOB 串流處理:超過 1MB 建議使用 SqlFileStream (Filestream) 或分塊讀寫,避免記憶體壓力。
  • 改用 SqlClient:SQL Server 專案請改用 SqlConnection/SqlCommand,效能優於 OleDb。
  • 非同步 I/O:.NET 4.5+ 可使用 ExecuteReaderAsync/ReadAsync 提升 UI 回應性。
  • ORM 整合:Entity Framework Core 以 byte[] 對應 BLOB,自動處理參數化與變更追蹤。

結語

掌握 MemoryStream 搭配 ADO.NET 參數化命令讀寫 BLOB,是處理資料庫二進位資料的基本功。範例展示的 RTF/純文字雙模式相容、資源正確釋放、錯誤處理等細節,能直接套用於實務專案中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved