最近利用NHibernate映射类型为Clob字段在插入数据时发现当字符的字节数(一个半角字符一个字节,一个全角字符两个字节)在2000-4000之间时报错(ORA-01461:仅能够插入LONG列的LONG值赋值)。通过不断查找资料和本身的试验该问题终于获得解决,下边我将本身的心得给你们作一个分享。
java
系统环境 xp+.net2.0+oracle9i
表结构(因为是测试,表结构随便建了一张) XX sql
字段名 | 类型 |
ID | VARCHAR2(70) |
TEST | CLOB |
代码: oracle
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时正常插入。 ui
缘由分析: spa
之因此会出现长度大于4000时报错,是由于Oracle中有SQL语句中两个单引号之间的字符数不能大于4000的限制。'" + data + "' data在sql语句之间,当data的值大于4000个字节时就会报错。 .net
解决办法: code
这种方式比较棘手,但有更好的方式,下边会讲到 。 ci
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();
状况分析: 字符串
采用这种方式可以正常插入。因此推荐用这种方式。
缘由分析:
无
解决办法:
无
代码:
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