使用IBatisNet对NText类型的字段插入超长文本
使用ibatisnet当对ntext类型的字段插入超长的文本时,报错误"当前命令发生了严重错误。应放弃任何可能产生的结果"
查了一下资料,当使用命名参数式sql语句时,对于ntext类型的参数,如指定length,则可避免上面的问题,
但ibatisnet的resultmap的property里只有dbtype而没有length,不知为何不提供? nhibernate里就有类似length的属性。
不过property里提供了一个typehandler,typehandler是一个type处理的扩展点,下面我们来看看如何使用它。
1. 类别处理实现
public class ntexttypehandler : itypehandlercallback
{
#region itypehandlercallback 成员
public object valueof(string s)
{
return s;
}
public object getresult(iresultgetter getter)
{
if(getter!=null)
return getter.value.tostring();
return "";
}
public void setparameter(iparametersetter setter, object parameter)
{
if(parameter==null)
{
setter.value="";
}
else
{
// 设置parameter的其它属性,本例为size.
((sqlparameter)setter.dataparameter).size = int.maxvalue;
setter.value = parameter;
}
}
#endregion
}
2. resultmap定义
<resultmap id="inforesult" class="info">
<result property="infoid" column="infoid"/>
<result property="title" column="title"/>
<result property="author" column="author"/>
<result property="keywords" column="keywords" />
<result property="pubdate" column="pubdate"/>
<result property="content" column="content" dbtype="ntext" typehandler="ntexttypehandler" />
</resultmap>
3. statement定义
<insert id="insertinfo" parameterclass="info">
insert into infos (title, author, pubdate, keywords, content)
values (#title#, #author#, #pubdate#, #keywords#, #content,handler=ntexttypehandler#)
<selectkey resultclass="int" type="post" property="infoid">
select scope_identity()
</selectkey>
</insert>
在sql语句里一定要用 #content, handler=xxx# 的方式来指定,如不指定则在resultmap里的设置是不起作用的,感觉这两片定义应该有个地方是多余的,等有时间再说了。
总结,ibatisnet提供的typehandler提供了一个灵活且简单的类型处理机制。
原文地址: http://blog.csdn.net/billy_zh/archive/2008/10/11/3058979.aspx