🌮 Dapper存取Blob类型数据
前言:
blob类型是数据库用于保存二进制文件的一种类型,可以将文件存储到数据库的表中。(使用到的情况比较少,毕竟文件可以直接在服务器上保存并且访问为什么要放到数据库里。但如果你服务器上空间紧张而数据库空间很宽裕的话也可以使用BLOB存储文件类型)
用例表
测试图片:
1.🚽 原生的Ado.Net 存取Blob
原生的Ado.Net存取Blob比较繁琐,
- 存Blob类型
[Test]
public void TestOne()
{
string row_id = "2023052615301302163504";
using(var conn = new OracleConnection(Encrypter.DecryptAES("XXXXX",
"XXXX", "XXXX")))
{
conn.Open();
OracleCommand command = new OracleCommand($@" update TB_CM_COMPANY_COST SET PDF_UPLOAD = :bb where ROW_ID = '{row_id}' ", conn);
command.CommandType = CommandType.Text;
FileStream fs = new FileStream($@"E:\\TestOne\\Tpic.png", FileMode.OpenOrCreate, FileAccess.ReadWrite);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
OracleBlob blob = new OracleBlob(conn);
blob.Write(buffer,0,buffer.Length);
command.Parameters.Add(":bb", OracleDbType.Blob).Value = blob;
command.ExecuteNonQuery();
}
}
插入成功如图:
- 取Blob类型
public void TestOne()
{
string row_id = "2023052615301302163504";
using(var conn = new OracleConnection(Encrypter.DecryptAES("XXXX",
"XXXX", "XXXXX")))
{
conn.Open();
#region 取Blob
string SelectBlob = $@"select PDF_UPLOAD from TB_CM_COMPANY_COST where ROW_ID = '{row_id}'";
OracleCommand command = new OracleCommand(SelectBlob, conn);
command.CommandType = CommandType.Text;
OracleDataReader dataReader = command.ExecuteReader();
if (dataReader.Read())
{
OracleBlob oracleBlob = dataReader.GetOracleBlob(0); //从dataReader中获取Blob类型
byte[] buffer = new byte[oracleBlob.Length]; //先读取
oracleBlob.Read(buffer, 0, (int)oracleBlob.Length);
FileStream fs = new FileStream("Pic.png", FileMode.OpenOrCreate, FileAccess.ReadWrite);
fs.Write(buffer, 0, buffer.Length); //再写入
fs.Close();
}
#endregion
}
}
}
获取成功:
2.🚀 通过Dapper获取和保存Blob类型
通过上面的例子可以看出,ADO.NET原生的方法操作blob类型需要一个OracleBlob类作为中介,通过它来获取流或是字节。然后再进行下一步的操作,如果要获取的数据比较多,则比较繁琐。
而Dapper的方法更加简单,直接用byte[]来传递二进制文件,操作则更加简单。
- Dapper保存Blob类型
string row_id = "2023052615190002159537";
using(var conn = new OracleConnection(Encrypter.DecryptAES("XXXXXXXX",
"XXXXX", "XXXXX")))
{
conn.Open();
#endregion
#region Dapper保存Blob
FileStream fs = new FileStream($@"E:\\TestOne\\Tpic.png", FileMode.OpenOrCreate, FileAccess.ReadWrite);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
//直接传byte[]数组,10分甚至9分简单
int res = conn.Execute($@" update TB_CM_COMPANY_COST SET PDF_UPLOAD = :bb where ROW_ID = '{row_id}' ", new { bb = buffer});
#endregion
}
- Dapper取Blob类型
byte[] buffer = conn.QueryFirst<byte[]>($@"Select PDF_UPLOAD from TB_CM_COMPANY_COST where ROW_ID = '{row_id}'", null);
FileStream fs = new FileStream("XXZ.png", FileMode.OpenOrCreate, FileAccess.ReadWrite);
fs.Write(buffer, 0, buffer.Length);
🚩 Tip: 如需通过ORM对象来获取Blob列,只需要将Blob列的对应类型设置为和上例中的byte[]即可。