求C#操作Oracle二进制大对象的类
自己找了一个类,能解决Blob类型的写入和读到本地的类
但更新数据库中已存的Blob数据的方法出错,请高手指点一下
/// <summary>
/// 更新现有项BLOB值
/// </summary>
/// <param name="fileName">路径名</param>
/// <param name="tableName">要更新的数据表</param>
/// <param name="blobColName">Blob类型列名</param>
/// <param name="key">要插入表中关键字列名</param>
/// <param name="keyData">关键字值</param>
public void UpdateBlob(string fileName, string tableName, string blobColName, string key, int keyData)
{
using (conn = new OracleConnection(connString))
{
try
{
conn.Open();
OracleCommand cmd = conn.CreateCommand();
// 利用事务处理(必须)
OracleTransaction transaction = cmd.Connection.BeginTransaction();
cmd.Transaction = transaction;
// 获得 OracleLob 指针,只能用于更新
cmd.CommandText = "select " + blobColName + " from " + tableName + " where " + key + " = " + keyData + " FOR UPDATE";
//cmd.CommandText ="insert into layer_ind(layer_id,content)"
OracleDataReader reader = cmd.ExecuteReader();
using (reader)
{
//Obtain the first row of data.
reader.Read();
//Obtain a LOB.
OracleLob tempLob = reader.GetOracleLob(0);
// 将文件写入 BLOB 中
FileStream fs = new FileStream(fileName, FileMode.Open);
tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
int length = 1048576;//int改为long,1048576更改为fs.Length
byte[] Buffer = new byte[length];
int i;
while ((i = fs.Read(Buffer, 0, length)) > 0)
{
tempLob.Write(Buffer, 0, i);
}
fs.Close();
tempLob.EndBatch();
cmd.Parameters.Clear();
}
// 提交事务
transaction.Commit();
}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}
}
}
出现错误是这样的:
System.Data.OracleClient.OracleException: ORA-22292: 无法在没有事务处理的情况下以读写模式打开 LOB
在 Yujia.BLOB.OracleLobData.UpdateBlob(String fileName, String tableName, String blobColName, String key, Int32 keyData) 位置 E:\C#练习\testReadFile\testReadFile\testReadFile\BLOB.cs:行号 170
在 testReadFile.testClass.button3_Click(Object sender, EventArgs e) 位置 E:\C#练习\testReadFile\testReadFile\testReadFile\testClass.cs:行号 59