我研究基于ORACLE Text的全文检索功能,开始接触ORACLE的BLOB字段,3年多了,自认为已经熟知BLOB字段的操作。但这次的难题迫使我更深入的认识ORACLE的BLOB字段。 BLOB字段能以二进制形式存放4G数据,200M的视频数据当然应该没问题,可以出错了?!原来的方法会报"Out of memory"错误,PLSQL Developer工具导入大视频数据,同样会报"Out of memory"错误。3.6G的视频数据又该如何导入?原来写入大字段的方法,导入一般的图片和文档一点问题没有。 /// <summary> /// 写大字段内容 /// (新方法,2010.2.4) /// </summary> /// <param name="pDbConn"></param> /// <param name="strTable"></param> /// <param name="strBlobField"></param> /// <param name="strFile"></param> /// <param name="strWhereClause"></param> /// <returns></returns> public bool WriteBlobField(System.Data.OleDb.OleDbConnection pDbConn, string strTable, string strBlobField, string strFile, string strWhereClause) { if (strWhereClause == "") { return false; } try { string strSQL = "UPDATE " + strTable + " SET " + strBlobField + " =:blob WHERE " + strWhereClause; OleDbCommand cmd = new OleDbCommand(strSQL, pDbConn); //无需说明类型 //cmd.Parameters.Add(new OleDbParameter("blob", SqlDbType.VarBinary)); // cmd.Parameters.AddWithValue("blob", SqlDbType.Binary); FileInfo fileInfo = new FileInfo(strFile); FileStream fsBlob = fileInfo.OpenRead();// new FileStream(strFile, FileMode.Open,FileAccess.Read); byte[] dataBlob = new byte[fsBlob.Length];//问题1所在 fsBlob.Read(dataBlob, 0, System.Convert.ToInt32(fsBlob.Length));//问题2所在 fsBlob.Close(); //采用新的方法,AddWithValue(); cmd.Parameters.AddWithValue("blob", dataBlob); //cmd.Parameters["blob"].Value = dataBlob; int result = cmd.ExecuteNonQuery(); if (result < 1) { return false; } } catch (Exception ex) { // MessageBox.Show(ex.Message, "写数据", MessageBoxButtons.OK); return false; } return true; } /// <summary> /// 将字符串写成大字段内容 /// (2010.2.4 修改) /// </summary> /// <param name="pDbConn"></param> /// <param name="strTable"></param> /// <param name="strBlobField"></param> /// <param name="strBlobContent"></param> /// <param name="strWhereClause"></param> /// <returns></returns> public bool WriteBlobField2(System.Data.OleDb.OleDbConnection pDbConn, string strTable, string strBlobField, string strBlobContent, string strWhereClause) { if (strWhereClause == "") { return false; } try { string strSQL = "UPDATE " + strTable + " SET " + strBlobField + " =:blob " + "WHERE " + strWhereClause; OleDbCommand cmd = new OleDbCommand(strSQL, pDbConn); cmd.Parameters.Add(strBlobField, SqlDbType.Binary); // byte[] dataBlob = new byte[strBlobContent.Length]; byte[] dataBlob = System.Text.Encoding.Default.GetBytes(strBlobContent); cmd.Parameters["blob"].Value = dataBlob; int result = cmd.ExecuteNonQuery(); if (result < 1) { return false; } } catch (Exception ex) { MessageBox.Show(ex.Message, "写数据", MessageBoxButtons.OK); return false; } return true; } 问题1:无法一次性开辟足够大空间(如1G),写入大视频时,会导致报内存不足。 问题2:System.Convert.ToInt32()会使3G的视频时,会报类型转换失败,数值值过大。 上面两个问题在网络中所有的方法中都普遍存在的,都会导致无法导入700M以上的视频数据。
|