MySQL 的 BLOB 類型可儲存二進位資料(圖片、檔案、序列化物件等)。本文示範如何使用官方 MySql.Data.dll 在 WinForms 中完成物件序列化寫入與讀取反序列化。
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=****;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}");
}
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));
}
}
}
}
MySqlDbType.Blob 參數型別GetBytes 分兩步:先取長度,再分配陣列讀取MemoryStream.Position = 0 確保反序列化從頭開始using 確保資源釋放