Dapper.net Nullable<DateTime>类型数据转换时异常问题解决

0x01运行环境

  1. dapper 版本1.50.2
  2. .net framework 4.5

0x02问题描述

实体对象中包含DateTime?、DateTime、int、int?等属性,在使用dapper方法IDbConnect.Query<>()方法时提示了 System.InvalidOperationException异常,经过排除法后确认为DateTime?导致的异常。

0x03问题定位

这里先来个快速提示,不想看过程的可以直接看标语,有修改方法。

出现这样转换失败的问题找到的是关系映射上类型转换时出错,然后找到了如下方法:

private static Func<IDataReader, object> GetTypeDeserializerImpl( Type type, IDataReader reader, int startBound = 0, int length = -1, bool returnNullIfFirstMissing = false )

这个方法主要做用是映射实体与sql查询结果的关系,其中包含了数据类型的转换,下面来对主要部分剖析下;在剖析前说明下dapper做类型转换用的两种方法分别为“类型强转”与相关类型“ Parse”方法转换,这是对基本类型的转换方式

//.......
var members = (specializedConstructor != null
                ? names.Select(n => typeMap.GetConstructorParameter(specializedConstructor, n))
                : names.Select(n => typeMap.GetMember(n))).ToList();
//.......  members是定义的实体属性、字段等
foreach (var item in members)
            {
                if (item != null)
                {
                    if (specializedConstructor == null)
                        il.Emit(OpCodes.Dup); // stack is now [target][target]
                    Label isDbNullLabel = il.DefineLabel();
                    Label finishLabel = il.DefineLabel();

                    il.Emit(OpCodes.Ldarg_0); // stack is now [target][target][reader]
                    EmitInt32(il, index); // stack is now [target][target][reader][index]
                    il.Emit(OpCodes.Dup);// stack is now [target][target][reader][index][index]
                    il.Emit(OpCodes.Stloc_0);// stack is now [target][target][reader][index]
                    il.Emit(OpCodes.Callvirt, getItem); // stack is now [target][target][value-as-object]
                    il.Emit(OpCodes.Dup); // stack is now [target][target][value-as-object][value-as-object]
                    StoreLocal(il, valueCopyLocal);
                    Type colType = reader.GetFieldType(index);
                    Type memberType = item.MemberType;

                    if (memberType == typeof(char) || memberType == typeof(char?))
                    {
                        il.EmitCall(OpCodes.Call, typeof(SqlMapper).GetMethod(
                            memberType == typeof(char) ? nameof(SqlMapper.ReadChar) : nameof(SqlMapper.ReadNullableChar), BindingFlags.Static | BindingFlags.Public), null); // stack is now [target][target][typed-value]
                    }
                    else
                    {
                        il.Emit(OpCodes.Dup); // stack is now [target][target][value][value]
                        il.Emit(OpCodes.Isinst, typeof(DBNull)); // stack is now [target][target][value-as-object][DBNull or null]
                        il.Emit(OpCodes.Brtrue_S, isDbNullLabel); // stack is now [target][target][value-as-object]

                        // unbox nullable enums as the primitive, i.e. byte etc

                        var nullUnderlyingType = Nullable.GetUnderlyingType(memberType);
        
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 药库管理系统是一种用于管理药品库存、采购、销售和监管的软件系统。在此系统中,结合了SQL Server 2012、Dapper、ASP.NET和Vue这些技术,可以实现一个高效、稳定和方便管理药库的系统。 首先,SQL Server 2012是一种强大的关系型数据库管理系统,可以存储和管理大量的数据。在药库管理系统中,可以使用SQL Server来存储药品的基本信息、库存信息、采购记录和销售记录等。 其次,Dapper是一个轻量级的ORM(对象关系映射)框架,可以方便地将数据库中的数据映射到.NET对象中,或者将.NET对象持久化到数据库中。在药库管理系统中,可以使用Dapper来实现对数据库的连接、查询、插入、更新和删除等操作,提高了数据的访问效率。 再次,ASP.NET是一种用于构建Web应用程序的框架,可以实现药库管理系统的前端部分。通过ASP.NET,可以实现用户登录、权限管理、药品信息的展示和编辑等功能。同,可以利用ASP.NET的强大特性和丰富的控件库,实现用户友好的界面和交互。 最后,Vue是一种用于构建用户界面的JavaScript框架,可以实现药库管理系统的前端展示和交互逻辑。通过Vue,可以将应用程序的各个组件拆分为多个可重用的模块,实现良好的代码管理和可维护性。使用Vue的前端框架,可以实现丰富的用户界面效果和响应式设计,提升用户体验。 综上所述,结合SQL Server 2012、Dapper、ASP.NET和Vue这些技术,可以实现一个功能完善、性能高效的药库管理系统。用户可以通过Web界面进行药品信息的查询、采购、销售和监管等操作,提高了药库管理的效率和精确性。 ### 回答2: 药库管理系统是一个涉及到药品采购、入库、出库、销售等流程的系统,综合使用了SQL Server 2012、Dapper、ASP.NET和Vue等技术进行开发。 首先,SQL Server 2012作为关系型数据库,为系统提供数据存储和管理功能。通过SQL Server 2012,可以创建药品、供应商、员工等相关数据表,并在表中存储各种信息。同,SQL Server 2012还支持事务处理和数据备份等功能,可保证系统在出现异常情况数据完整性和可靠性。 其次,Dapper.NET平台下轻量级的ORM框架,用于实现对象关系映射。在药库管理系统中,Dapper可以轻松地将SQL Server 2012中的数据表与.NET对象进行映射,实现数据的快速访问和操作。通过Dapper的简洁语法,可以方便地进行数据库的查询、新增、修改和删除等操作,提高了开发效率。 再次,ASP.NET作为一种基于.NET平台的Web应用程序开发框架,为药库管理系统提供了强大的后端支持。通过ASP.NET,我们可以依托其强大的生态系统和丰富的控件库,快速搭建一个易于维护和扩展的Web应用程序。ASP.NET还提供了良好的安全性和性能优化特性,能够保护系统的安全和提升用户体验。 最后,Vue作为一种流行的前端JavaScript框架,为药库管理系统提供了丰富的用户界面交互功能。通过Vue的组件化开发模式和响应式数据绑定机制,可以方便地构建出具有良好用户体验的界面。同,Vue还具备虚拟DOM和自动化构建等特性,能够提高系统的性能和开发效率。 综上所述,药库管理系统通过综合使用SQL Server 2012、Dapper、ASP.NET和Vue等技术,实现了数据存储与管理、对象关系映射、强大的后端支持以及用户界面的交互功能,为药库的管理提供了便利。 ### 回答3: 药库管理系统是一个用于管理药品库存、药品销售和供应链管理的软件系统。SQL Server 2012是一个用于存储和管理系统数据的关系型数据库管理系统(RDBMS)。Dapper是一个简单易用的对象关系映射工具,可以将数据库查询结果映射为.NET对象,方便在ASP.NET中进行数据访问操作。而ASP.NET是一种用于构建Web应用程序的开发框架,它提供了丰富的工具和组件来加速开发过程。Vue是一种流行的JavaScript框架,用于构建用户界面。 药库管理系统的实现中,可以使用ASP.NET作为后台开发框架,利用其强大的数据访问能力和安全性特性。可以使用Dapper作为ORM工具,简化数据操作过程,并提高性能。SQL Server 2012可以作为系统的数据库,用于存储药品信息、库存、销售记录等数据。借助SQL Server 2012的强大查询和事务处理功能,可以实现快速、可靠的数据操作。 在前端部分,可以使用Vue框架构建用户界面,利用Vue提供的组件化开发和数据双向绑定特性,实现良好的用户体验。可以使用Vue Router实现页面路由管理,使用Vuex进行状态管理,提高系统的可维护性和扩展性。 药库管理系统的功能可以包括:药品信息管理(包括添加、修改、删除药品信息)、库存管理(药品入库、出库、盘点等)、销售管理(药品销售、退货等)、供应链管理(药品采购、供应商管理)、报表统计等。 总之,结合SQL Server 2012、Dapper、ASP.NET和Vue等技术,可以实现一个功能完善、性能高效、易于维护和扩展的药库管理系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值