|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我见过net网页编程运行在手机上,包括很廉价的山寨手机,但是却暂时没发现.net在手机上有什么作为。wp7可能是个转机,但是按照《net网页编程的跨平台就是一句谎言。那.net的跨平台也当之无愧是一句谎言。NBearMapping是一个开源的对象映照工具,可用于恣意范例对象、DataRow和DataReader对象间的通明映照。
开辟者:TeddyMa、阿不
源代码地点:http://svn.cnblogs.com:8080/svn/NBear/trunk/src(能够用SVN客户端签出)
博客园开辟中已大批利用NBearMapping,次要用于在数据会见层完成DataReader至实体类的映照。
明天在利用时碰到一个成绩,成绩产生在一个列举范例属性的映照时,毛病信息以下:
System.InvalidCastException:Specifiedcastisnotvalid.
atSystem.Data.SqlClient.SqlBuffer.get_Int32()
atSystem.Data.SqlClient.SqlDataReader.GetInt32(Int32i)
atmf702c3fb37254bdb8276ca8f6f6c878e(Object,Object)
atNBear.Mapping.ObjectMapper.ConvertObject(ObjectinputObject,ObjectoutputObject)
atNBear.Mapping.ObjectMapper.ConvertObject(ObjectinputObject)
之前常常举行列举范例的映照,没碰到干涉题,厥后发明,是因为该属性在数据库中的数据范例是tinyint,改成int,成绩就办理了。
为了找到成绩的真正缘故原由,不能不硬着头皮看NBearMapping的源代码。终究在DataReaderGetterGenerator.cs中找到成绩的缘故原由。
当碰到列举范例时,NBearMapping挪用IDataReader的GetInt32读取数据,当数据范例是tinyint时,就会激发“Specifiedcastisnotvalid”非常。
caseTypeCode.Int32:
getMethod=typeof(IDataRecord).GetMethod("GetInt32");
break;
办理办法:关于列举范例时,挪用IDataReader的GetValue读取数据:
if(memberValue.LocalType.IsEnum)
{
getMethod=typeof(IDataRecord).GetMethod("GetValue");
mustBeUnBox=true;
}
但如许就必要举行强迫范例转换和拆箱操纵,经由过程反射举行强迫范例转换的代码以下:
//Teddy2008-2-2:addedthecodesectionbelowtoconverttheobjecttothememberValue.LocalType
if(getMethod==typeof(IDataRecord).GetMethod("GetValue"))
{
generator.Load(Type.GetTypeCode(memberValue.LocalType));
generator.Call(typeof(Convert).GetMethod("ChangeType",BindingFlags.Instance|BindingFlags.Public|BindingFlags.Static,null,newType[]{typeof(object),typeof(TypeCode)},null));
}
拆箱操纵的代码:
ILGenerator.Emit(OpCodes.Unbox_Any,type)
假如不想增添这个拆箱操纵,那就制止利用tinyint数据范例。
借这个漫笔,想问一下人人在实践开辟顶用甚么办法举行数据库与对象之间的映照?
效率会有不少的变化。而实际上net网页编程是基于堆栈机器来设计,这和我们常见的基于寄存器的本地机器是差异比较大的。总体来说,这是一种虚拟机的设计思路。 |
|