学网站建设难/百度软件
🌮 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 取Blobstring 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保存BlobFileStream 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[]即可。