指引网

当前位置: 主页 > 数据库 > Oracle >

Oracle中BLOB字段存储4GB以下视频数据的方法

来源:网络 作者:佚名 点击: 时间:2018-01-13 06:38
[摘要] 今天想和网友分享一下 Oracle 中BLOB大字段如何读写视频数据,这个话题起因是我在使用ORACLE备份数据时,误删了数据库实例的控制文件,导致项目数据需要重新入库。也就是我在弥补这个错误时
今天想和网友分享一下"Oracle中BLOB大字段如何读写视频数据",这个话题起因是我在使用ORACLE备份数据时,误删了数据库实例的控制文件,导致项目数据需要重新入库。也就是我在弥补这个错误时,发现之前的数据入库功能,都没有把200M以上的视频数据导入ORACLE的BLOB字段里,也就是之前的写入BLOB字段数据的方法失效了。这是个惊人的发现,我发现因为这个程序BUG我遗漏掉近300G的视频数据,某些单个视频文件数据量达到3.6G.

  我研究基于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以上的视频数据。

------分隔线----------------------------