我是靠谱客的博主 传统水壶,最近开发中收集的这篇文章主要介绍C#处理oracle数据库的Clob类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

通过C#语言,使用.net的ado组件录入oracle数据库的Clob类型字段:

1。当录入字符串过长,导致ado的命令Command的CommandText字符串大于4056,录入会失败,提示:

ORA-01704字符串文字太长。

2。同样情况下,如果采用通过ado的命令Command访问oracle存储过程,并且使用命令参数形式传入超长的字符串,当字符串本身长度大于32512时,录入才会失败,提示:

ORA-01460 转换请求无法实现或不合理。

出现上述两种情况,可以用下面代码解决:

 

 /// <summary>
/// 处理clob数据后保存,成功
/// </summary>
private void button1_Click(object sender, EventArgs e)
{
string ClobString = CreateClobString();
string ConnectionString = ConfigurationManager.AppSettings["ConnectionString"].ToString();
System.Data.OracleClient.OracleConnection oc = new System.Data.OracleClient.OracleConnection(ConnectionString);
oc.Open();
try
{
OracleCommand command = new OracleCommand();
command.Connection = oc;
command.CommandType = CommandType.Text;
command.CommandText = "INSERT INTO demo_table (demo_id,demo_clob) VALUES ("+id.ToString()+", 'aa')";
richTextBox1.Text = "SQL语句字符串长度:" + command.CommandText.Length + "rn" + "SQL语句字符串内容:";
richTextBox1.Text += command.CommandText;
int ii = command.ExecuteNonQuery();
//修改Clob数据
if (ii > 0)
UpdateClobData(oc, "SELECT demo_clob FROM demo_table WHERE demo_id=" + id + " FOR UPDATE", ClobString);
}
catch (Exception ex)
{
MessageBox.Show("保存失败:" + ex.Message);
}
finally
{
oc.Close();
}
}
#region Oracle大对象处理
/// <summary>
/// // CreateTempLob
/// </summary>
private OracleLob CreateTempLob(OracleCommand cmd, OracleType lobtype)
{
if (lobtype == null) return null;
if (cmd == null) return null;
//Oracle server syntax to obtain a temporary LOB.
cmd.CommandText = "DECLARE A " + lobtype + "; " +
"BEGIN " +
"DBMS_LOB.CREATETEMPORARY(A, FALSE); " +
":LOC := A; " +
"END;";
//Bind the LOB as an output parameter.
OracleParameter p = cmd.Parameters.Add("LOC", lobtype);
p.Direction = ParameterDirection.Output;
//Execute (to receive the output temporary LOB).

cmd.ExecuteNonQuery();
//Return the temporary LOB.
return (OracleLob)p.Value;
}
/// <summary>
/// 修改Clob数据
/// </summary>
public void UpdateClobData(OracleConnection sc, string SQLString, string ReportString)
{
if (sc == null) return;
if (string.IsNullOrEmpty(SQLString)) return;
if (string.IsNullOrEmpty(ReportString)) return;
//用OracleLob输入Clob数据
OracleCommand cmd = sc.CreateCommand();
cmd.Transaction = cmd.Connection.BeginTransaction();
cmd.CommandText = SQLString;
OracleDataReader reader = cmd.ExecuteReader();
using (reader)
{
reader.Read();
OracleLob blob = reader.GetOracleLob(0);
OracleLob templob = CreateTempLob(cmd, blob.LobType);
byte[] buffer = System.Text.Encoding.Unicode.GetBytes(ReportString);
//将文件内容传入Blob变量

templob.BeginBatch(OracleLobOpenMode.ReadWrite);
templob.Write(buffer, 0, buffer.Length);
templob.Position = 0;
long actual = templob.CopyTo(blob);
cmd.Transaction.Commit();
}
}
#endregion

下面是示例代码地址:

 http://files.cnblogs.com/wrzhao/DemoApplication.rar

下载后,需要执行“demoSQL.sql”建立程序运行所需表和存储过程;需要修改“App.config”文件里的数据库连接字符串。

转载于:https://www.cnblogs.com/wrzhao/archive/2012/09/12/wrzhao.html

最后

以上就是传统水壶为你收集整理的C#处理oracle数据库的Clob类型的全部内容,希望文章能够帮你解决C#处理oracle数据库的Clob类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部