您好,欢迎访问一九零五行业门户网

Oracle中Clob类型处理解析

系统环境 xp+2.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
下边采用nhibernate插入数据,nhibernate具体怎用不在本次讨论范围。
nhibernate采用的版本为1.2.1.4000。
下边大至把简要配置写下。
app.config
value=data source=orcl_192.168.0.232;user id =icqs_test;password=icqs_test />
key=hibernate.adonet.batch_size
value=100
/>
xx.cs
using system;
using system.collections.generic;
using system.text;
namespace test.enties
{
[serializable]
public class xx
{
public xx()
{
}
private string id;
public virtual string id
{
get { return id; }
set { id = value; }
}
其它类似信息

推荐信息