宝哥软件园

IBatis .网中的数据类型转换解决方案

编辑:宝哥软件园 来源:互联网 时间:2021-08-03

类型:编程辅助大小:134KB语言:中文评分:3.3标签:立即下载这两天被一个问题折磨得死去活来,终于解决了,写下来以备参考:

问题是这样的:我在项目中使用了伊巴蒂斯.Net,数据库使用的是微软访问。因为接近数据库没有漂浮物或两倍类型,只有货币类型可以用作浮点数。所以我定义了类似如下的对象,表,以及结构化查询语言语句:

1.对象

公共课马克

{

公共字符串主题{.}

公共国际年.}

公共双点.}

}

2.数据库标记

主题文本

年数

点币

3.结构化查询语言语句

声明

selectid=' Query '参数映射=' pMarkMap '结果映射=' rMarkMap '

选择主题、年份、点

来自马克

dynamicprepend='Where '

isNotNullprepend='AND '属性='主题'

主题=#主题#

/isNotNull

isNotNullprepend='AND '属性='年'

年份=#年份#

/isNotNull

/动态

/select

/语句

4.查询数据库

Mark Mark=新Mark();

马克。年份=2005年;

映射器=映射器.instance();

对象对象=映射器。查询对象('标记。查询,标记);

标记=作为标记的对象;

ArrayList list=new ArrayList();

名单。添加(obj);

网格数据源=列表

结果抛出异常:"指定的强制转换无效。"

这个问题困扰了我两天,最后才发现两个解决办法:

1.将对象中的要点属性的类型改成十进制。这种方法固然简单,可是在数据库中使用货币乃不得已,在数据库中却有浮动类型可以使用,IBatis自动支持从。网的两倍类型到数据库浮动类型的转换。所以如果为了货币而使用十进制,则后台数据库变成数据库或是神谕时,在数据库端不得不使用小数/货币等类型。或者修改程序中的小数定义为两倍类型,这都不是很合理。所以,下面是一个相对复杂一点却合理的解决方法。

注:IBatis .网自动支持的类型转换请参阅数据映射器开发人员指南1.5.0版第3.6章,3.7:支持的数据库类型

2.使用自定义类型转换函数

定义类

使用系统;

使用IBatisNet .常见;

使用IBatisNet .数据映射器。

命名空间测试

{

公共类DoubleCurrencyTypeHandler :

IBatisNet .数据映射器

{

#区域itypeahandlercallback成员

//此类型的空值

公共对象空值

{

得到

{

返回空

}

}

公共对象值(字符串)

{

//这个函数用于将空值值翻译成要比较的空值

//如果没有,则推荐返回字符串s

返回s;

}

公共对象获取结果

{

//用于将从数据库读取的值转换成。网中的值

//这里我们知道货币可以转成小数类型,

//再用显示转换将小数转换成两倍

十进制v1=转换ToDecimal(getter .价值);

double v2=(double)v1;

返回v2;

}

公共void SetParameter(iparametertsetter,setter对象参数)

{

//TODO:将。网中的两倍型转换成十进制,再转换成货币

十进制v1=转换. ToDecimal(参数);

塞特。值=v1

}

#endregion

}

}

定义结构化查询语言中的参数映射及结果图

在SqlMap.config中加入下面的语句

别名

typeAliasalias='DoubleCurrency '

type=' TestIBatis .DoubleCurrencyTypeHandler,test batis '/

/别名

类型句柄

typenhandlertype=' double ' dbtype=' Currency '回调=' double Currency '/

/typeHandlers

在结构化查询语言语句所在的Mark.xml文件里加上如下语句

别名

aliasalias type=' Mark ' type=' test batis . '' Mark,TestIBatis'/

/别名

参数映射

参数mapid=' pMarkMap '类=' Mark '

参数属性="主题"列="主题"

参数属性="年"列="年"

type='Int32'dbType='Integer'/

参数属性="点"列="点"

type=' double ' dbtype=' Currency '/

/parameterMap

/parameterMaps

结果地图

结果映射id='rMarkMap '类='马克'

结果属性="主题"列="主题"

结果属性='年'列='年'类型='Int32'dbType='Integer'/

结果属性="点"列="点"

type=' double ' dbtype=' Currency '/

/resultMap

/结果图

声明

selectid=' Query '参数映射=' pMarkMap '结果映射=' rMarkMap '

选择主题、年份、点

来自马克

dynamicprepend='Where '

isNotNullprepend='AND '属性='主题'

主题=#主题#

/isNotNull

isNotNullprepend='AND '属性='年'

年份=#年份#

/isNotNull

/动态

/select

/语句

运行程序,一切正常

注:关于自定义类型转换,请参阅数据映射器开发人员指南1.5.0版第3.5.5章自定义类型处理程序

更多资讯
游戏推荐
更多+