IBatis .网中的数据类型转换解决方案
类型:编程辅助大小: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章自定义类型处理程序
版权声明:IBatis .网中的数据类型转换解决方案是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。