posts - 710,  comments - 81,  views - 260万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

 最近为Clob字段在插入数据时发现当字符的字节数(一个半角字符一个字节,一个全角字符两个字节)在2000-4000之间时报错(ORA-01461:仅可以插入LONG列的LONG值赋值)。经过不断查找资料和自己的试验该问题终于得到解决,下边我将自己的心得给大家做一个分享。

准备

系统环境 xp+.net2.0+oracle9i

表结构(由于是测试,表结构随便建了一张) XX

字段名 类型
ID VARCHAR2(70)
TEST CLOB

 

测试

方式1:直接将CLOB的值拼写在SQL语句中。

代码:

 

string id = Guid.NewGuid().ToString();
OracleCommand cmd = Conn.CreateCommand();
cmd.CommandText = "insert into xx(id,test) values('" + id + "','" + data + "')";// data是一个变量,存储你要插入的字符串
cmd.ExecuteNonQuery();

情况分析:

当data的长度大于4000时报错(ORA-01704:文字字符串过长),小于或等于4000时正常插入。

原因分析:

之所以会出现长度大于4000时报错,是因为Oracle中有SQL语句中两个单引号之间的字符数不能大于4000的限制。'" + data + "' data在sql语句之间,当data的值大于4000个字节时就会报错。

解决办法:

这种方式比较棘手,但有更好的方式,下边会讲到 。

方式2:采用参数形式。

代码:

复制代码
复制代码
string id = Guid.NewGuid().ToString();
OracleCommand cmd = Conn.CreateCommand();
cmd.CommandText = "insert into xx(id,test) values('" + id + "',:p1)";
OracleParameter p1 = new OracleParameter("p1", OracleType.Clob);
p1.Value = data; // data是一个变量,存储你要插入的字符串
cmd.Parameters.Add(p1);
cmd.ExecuteNonQuery();
复制代码
复制代码

情况分析:

采用这种方式能够正常插入。所以推荐用这种方式。

原因分析:

  无

解决办法:

方式3:采用参数形式,但是参数类型写为OracleType. NVarChar

代码:

复制代码
复制代码
string id = Guid.NewGuid().ToString();
OracleCommand cmd = Conn.CreateCommand();
cmd.CommandText = "insert into xx(id,test) values('" + id + "',:p1)";
OracleParameter p1 = new OracleParameter("p1", OracleType. NVarChar);
p1.Value = data; // data是一个变量,存储你要插入的字符串 
cmd.Parameters.Add(p1);
cmd.ExecuteNonQuery();
复制代码
复制代码

情况分析:

为什么要写这种方式,因为这种方式和采用NHibernate的方式很相似,先看看在这种方式会产生什么情况。当data的字节数在0-2000之间时正常插入,大于4000时也正常插入,但在2000-4000时则失败,报错(ORA-01461:仅可以插入LONG列的LONG值赋值)

原因分析:

没有采用对应的Oracle类型。

解决办法:

采用OracleType.Clob

 转载自:https://www.cnblogs.com/xiaotiannet/p/3846966.html

posted on   itprobie-菜鸟程序员  阅读(2767)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2015-01-30 weblogic如何部署web应用
2015-01-30 如何启动jdeveloper中集成的weblogic
点击右上角即可分享
微信分享提示