Oracle 使用BLOB类型保存大文件、图片之类的文件,blob可保存小于4GB字节的文件
方法呢,就是先把图片或者文件转换成数据流 byte[]
在把流保存到blob字段中
但是你可能会碰到一个问题,某个文件或者图片太大了(byte[].length大于int),通过存储过程写入到数据库的似乎会发生错误。
解决方法:
1、不使用存储过程
2、将byte[]直接转换成blob类型
我的第二个方法经验:
这个转换方法
#region 转换大文件
public OracleLob ByteToOracleLob(byte[] p_bytes)
{
//必须保证连接是开的
//dbOperate.Open();
string strSQLTemp = "declare xx blob; begin dbms_lob.createtemporary(xx, false, 0); :tempblob := xx; end;";
OracleParameter[] Params1 = new OracleParameter[1];
Params1[0] = new OracleParameter("tempblob", OracleType.Blob);
Params1[0].Direction = System.Data.ParameterDirection.Output;
OracleCommand oracmd=dbOperate.CreateCommand(strSQLTemp, "CommandType.Text");
oracmd.Parameters.AddRange(Params1);
oracmd.ExecuteNonQuery();
OracleLob tempLob = (OracleLob)Params1[0].Value;
tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
tempLob.Write(p_bytes, 0, p_bytes.Length);
tempLob.EndBatch();
//dbOperate.Close();
return tempLob;
}
#endregion
调用的时候如下面例子:
dbOperate.Open();
dbOperate.BeginTrans();
System.Data.OracleClient.OracleCommand oraCmd = dbOperate.CreateCommand("PKG_BDMS.Pro_Update_TerminalIcon");
oraCmd.Parameters.Add("V_BG_PC", OracleType.Blob);
oraCmd.Parameters["V_BG_PC"].Value = ByteToOracleLob(bgpc);
。。。。。。。
oraCmd.ExecuteNonQuery();
dbOperate.CommitTrans();
记得使用事务