设为首页 加入收藏

TOP

Oracle中利用BLOB字段存储4GB以下视频数据
2014-11-24 02:33:13 来源: 作者: 【 】 浏览:4
Tags:Oracle 利用 BLOB 存储 4GB 以下 视频 数据

今天想和网友分享一下“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的视频数据又该如何导入?原来写入大字段的方法,导入一般的图片和文档一点问题没有。

///

/// 写大字段内容

/// (新方法,2010.2.4)

///

///

///

///

///

///

///

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;

}

///

/// 将字符串写成大字段内容

/// (2010.2.4 修改)

///

///

///

///

///

///

///

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; &nbs

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Oracle代替sql Server自增字段的.. 下一篇TPC-C性能测试Oracle创世界纪录

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·新书介绍《Python数 (2025-12-25 04:49:47)
·怎么利用 Python 进 (2025-12-25 04:49:45)
·金融界大佬力荐,Pyt (2025-12-25 04:49:42)
·你必须要弄懂的多线 (2025-12-25 04:22:35)
·如何在 Java 中实现 (2025-12-25 04:22:32)