首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

C# 操作 MySQL BLOB 欄位完整實戰:序列化儲存與讀取反序列化

     編輯:MySQL 綜合教學

C# 實現 MySQL BLOB 資料儲存與讀取完整指南

MySQL 的 BLOB 類型可儲存二進位資料(圖片、檔案、序列化物件等)。本文示範如何使用官方 MySql.Data.dll 在 WinForms 中完成物件序列化寫入與讀取反序列化。

一、環境準備

  • NuGet 安裝:Install-Package MySql.Data(或 6.9.6 版本)
  • 資料表結構:mm (id INT PK AI, arr BLOB)
  • 連線字串:server=127.0.0.1;user=root;database=test;port=3306;password=****;

二、寫入 BLOB:物件序列化為位元組陣列

private void btnInsert_Click(object sender, EventArgs e)
{
    // 1. 準備資料:整數陣列 {1,2,3}
    int[] arr = { 1, 2, 3 };
    
    // 2. 二進位序列化
    using (var ms = new MemoryStream())
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(ms, arr);
        byte[] blobData = ms.ToArray();

        // 3. 寫入資料庫
        using (var conn = new MySqlConnection(connStr))
        using (var cmd = new MySqlCommand("INSERT INTO mm(arr) VALUES(@blobData)", conn))
        {
            cmd.Parameters.Add("@blobData", MySqlDbType.Blob).Value = blobData;
            conn.Open();
            cmd.ExecuteNonQuery();
        }
    }
    MessageBox.Show($"寫入成功,位元組長度:{blobData.Length}");
}

三、讀取 BLOB:位元組陣列反序列化為物件

private void btnRead_Click(object sender, EventArgs e)
{
    using (var conn = new MySqlConnection(connStr))
    using (var cmd = new MySqlCommand("SELECT arr FROM mm WHERE id = @id", conn))
    {
        cmd.Parameters.AddWithValue("@id", 6);
        conn.Open();
        using (var reader = cmd.ExecuteReader())
        {
            if (!reader.Read()) throw new Exception("無資料");
            
            // 取得 BLOB 長度並讀取
            long len = reader.GetBytes(0, 0, null, 0, 0);
            byte[] blob = new byte[len];
            reader.GetBytes(0, 0, blob, 0, (int)len);

            // 反序列化
            using (var ms = new MemoryStream(blob))
            {
                var formatter = new BinaryFormatter();
                int[] arr = (int[])formatter.Deserialize(ms);
                MessageBox.Show("讀取結果:" + string.Join(" ", arr));
            }
        }
    }
}

四、關鍵點總結

  1. 使用 MySqlDbType.Blob 參數型別
  2. GetBytes 分兩步:先取長度,再分配陣列讀取
  3. MemoryStream.Position = 0 確保反序列化從頭開始
  4. 善用 using 確保資源釋放
  5. 大檔案建議分塊讀寫,避免記憶體壓力
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved