由于种种原因,需要将文件直接存储到Oracle的Blob字段中,功能已经完成,记录一下实现过程。
采用winform实现需要的功能,首先在数据库中建表,其中一个字段为Blob类型,怎么创建就不说了。思路很简单,就是文件流读取电脑上的文件,然后通过insert语句将文件的字节流数组存进表中,代码如下:
//通过Stream读取文件,并转换为byte数组
Stream stream = File.Open(ChoosedFilePaths[i], FileMode.Open, FileAccess.Read, FileShare.Read); byte[] buffer = new byte[stream.Length]; stream.Read(buffer, 0, buffer.Length); string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; OracleConnection conn = new OracleConnection(constr); OracleParameter param = null; OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "insert into FJG_FILE_MANAGE(NUMBERS,FILE_NAME,FILECONTENT) VALUES('" + attributes.Number + "','" + attributes.FileName + "',:contents,'")"; param = new OracleParameter("contents", OracleType.Blob, buffer.Length); param.Value = buffer; cmd.Parameters.Add(param); try { conn.Open(); cmd.ExecuteNonQuery(); } catch(System.Exception e) { log.Append("上传状态:\t失败!\r\n" + "失败原因:\t" + e1.Message + "\r\n\r\n"); } finally { cmd.Close(); }
本来采用的是OleDb,后来测试发现不好使,好像是Provider的问题,然后改为OracleClient来进行上传,OracleClient不需要Provider。
关键是sql语句中Blob字段的参数要写成“:ParameterName”的形式。