使用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

posted on 2009-01-19 20:06  arnold zhang  阅读(403)  评论(0编辑  收藏  举报