乐观 发表于 2015-1-18 11:16:01

ASP.NET网站制作之关于NBearMapping中列举范例转换的一个Bug仓酷云

我见过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网页编程是基于堆栈机器来设计,这和我们常见的基于寄存器的本地机器是差异比较大的。总体来说,这是一种虚拟机的设计思路。

冷月葬花魂 发表于 2015-1-20 18:53:05

同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。

愤怒的大鸟 发表于 2015-1-24 05:57:21

ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。

飘飘悠悠 发表于 2015-1-31 21:20:42

我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。

若相依 发表于 2015-2-5 06:07:43

ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。

精灵巫婆 发表于 2015-2-10 22:54:12

使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。

再见西城 发表于 2015-3-1 17:04:11

那么,ASP.Net有哪些改进呢?

蒙在股里 发表于 2015-3-10 21:11:31

现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。

莫相离 发表于 2015-3-11 14:27:07

以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。

兰色精灵 发表于 2015-3-18 18:50:36

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。

变相怪杰 发表于 2015-3-26 10:26:54

由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。
页: [1]
查看完整版本: ASP.NET网站制作之关于NBearMapping中列举范例转换的一个Bug仓酷云