再不用担心DataRow类型转换和空值了(使用扩展方法解决高频问题)

在使用DataRow读取数据时,通常会遇到数据可能为Null, 但是又需要转换为如int等其它类型的数据,因此就通常会写这样的代码:

if (dr[name] != DBNull.Value && dr[name] != null)
{
    if (!int.TryParse(dr[name].ToString(), out result))
        throw new Exception("整形转换失败");
}

而且这样的代码通常会大段大段出现在很多地方。
对于比较懒惰的程序员来说,这样的RY(repeat yourself)是一件很痛苦的事情,因此是时候来想个更好的方法了。这里首先想到的就是Extension Method。

很简单的几句代码,有了这个方法之后,在使用DataRow时,就可以通过扩展方法读取数据了

model.Id =  dr.SafeRead<Int32>("Id",0);
model.codeNum = dr.GetString("codeNum");


简单但是实用的代码,希望对大家在项目中有所帮助。

这里参考了,一下两篇文章,并进行了代码重新组织,最后是整理后类源码

使用 Extension Methods 来使 IDataReader 更加方便

C#底层SqlDataReader类常用扩展

    public static class SystemDataExtension{#region DataReader 扩展public static T SafeRead<T>(this IDataReader reader, string fieldName, T defaultValue){try{object obj = reader[fieldName];if (obj == null || obj == System.DBNull.Value)return defaultValue;return (T)Convert.ChangeType(obj, defaultValue.GetType());}catch{return defaultValue;}}/// <summary>          /// 获取字符串类型数据   /// </summary>     /// <param name="dr"></param>  /// <param name="name"></param>      /// <returns></returns>      public static string GetString(this IDataReader dr, string name){if (dr[name] != DBNull.Value && dr[name] != null)return dr[name].ToString();return String.Empty;}/// <summary>          /// 获取非空类型数据         /// </summary>          /// <param name="con"></param>/// <param name="name"></param>/// <returns></returns>        public static DateTime GetDateTime(this IDataReader dr, string name){DateTime result = DateTime.Now;if (dr[name] != DBNull.Value && dr[name] != null){if (!DateTime.TryParse(dr[name].ToString(), out result))throw new Exception("日期格式数据转换失败");}return result;}/// <summary>          /// 获取可空类型日期数据         /// </summary>          /// <param name="dr"></param>         /// <param name="name"></param>         /// <returns></returns>          public static DateTime? GetNullDateTime(this IDataReader dr, string name){DateTime? result = null;DateTime time = DateTime.Now;if (dr[name] != DBNull.Value && dr[name] != null){if (!DateTime.TryParse(dr[name].ToString(), out time))throw new Exception("日期格式数据转换失败");result = time;}return result;}/// <summary>          /// 获取guid类型数据         /// </summary>          /// <param name="dr"></param>         /// <param name="name"></param>         /// <returns></returns>          public static Guid GetGuid(this IDataReader dr, string name){Guid guid = Guid.Empty;if (dr[name] != DBNull.Value && dr[name] != null){if (Guid.TryParse(dr[name].ToString(), out guid))throw new Exception("guid类型数据转换失败");}return guid;}/// <summary>         /// 获取整形数据         /// </summary>          /// <param name="dr"></param>         /// <param name="name"></param>         /// <returns></returns>         public static int GetInt32(this IDataReader dr, string name){int result = 0;if (dr[name] != DBNull.Value && dr[name] != null){if (!int.TryParse(dr[name].ToString(), out result))throw new Exception("整形转换失败");}return result;}/// <summary>         /// 获取双精度类型数据 /// </summary>    /// <param name="dr"></param>   /// <param name="name"></param>     /// <returns></returns>          public static double GetDouble(this IDataReader dr, string name){double result = 0.00;if (dr[name] != DBNull.Value && dr[name] != null){if (!double.TryParse(dr[name].ToString(), out result))throw new Exception("双精度类型转换失败");}return result;}/// <summary>          /// 获取单精度类型数据         /// </summary>          /// <param name="dr"></param>         /// <param name="name"></param>         /// <returns></returns>          public static float GetSingle(this IDataReader dr, string name){float result = 0.00f;if (dr[name] != DBNull.Value && dr[name] != null){if (!float.TryParse(dr[name].ToString(), out result))throw new Exception("单精度类型转换失败");}return result;}/// <summary>          /// 获取decimal类型数据         /// </summary>          /// <param name="dr"></param>  /// <param name="name"></param>     /// <returns></returns>          public static decimal GetDecimal(this IDataReader dr, string name){decimal result = 0.00m;if (dr[name] != DBNull.Value && dr[name] != null){if (!decimal.TryParse(dr[name].ToString(), out result))throw new Exception("Decimal类型转换失败");}return result;}/// <summary>          /// 获取int16类型数据         /// </summary>          /// <param name="dr"></param>         /// <param name="name"></param>         /// <returns></returns>          public static Int16 GetInt16(this IDataReader dr, string name){short result = 0;if (dr[name] != DBNull.Value && dr[name] != null){if (!short.TryParse(dr[name].ToString(), out result))throw new Exception("短整形转换失败");}return result;}/// <summary>          /// 获取Byte类型数据         /// </summary> ///  <param name="dr"></param>         /// <param name="name"></param>         /// <returns></returns>          public static byte GetByte(this IDataReader dr, string name){byte result = 0;if (dr[name] != DBNull.Value && dr[name] != null){if (!byte.TryParse(dr[name].ToString(), out result))throw new Exception("Byte类型转换失败");}return result;}/// <summary>          /// 获取bool类型数据如果传值是1或者是返回true;        /// </summary>          /// <param name="con"></param>         /// <param name="name"></param>         /// <returns></returns>          public static bool GetBool(this IDataReader dr, string name){if (dr[name] != DBNull.Value && dr[name] != null){return dr[name].ToString() == "1" || dr[name].ToString() == "是" || dr[name].ToString().ToLower() == "true";}return false;} #endregion#region DataRow 扩展public static T SafeRead<T>(this DataRow dr, string fieldName, T defaultValue){try{object obj = dr[fieldName];if (obj == null || obj == System.DBNull.Value)return defaultValue;return (T)Convert.ChangeType(obj, defaultValue.GetType());}catch{return defaultValue;}}/// <summary>          /// 获取字符串类型数据   /// </summary>     /// <param name="dr"></param>  /// <param name="name"></param>      /// <returns></returns>      public static string GetString(this DataRow dr, string name){if (dr[name] != DBNull.Value && dr[name] != null)return dr[name].ToString();return String.Empty;}/// <summary>          /// 获取非空类型数据         /// </summary>          /// <param name="con"></param>/// <param name="name"></param>/// <returns></returns>        public static DateTime GetDateTime(this DataRow dr, string name){DateTime result = DateTime.Now;if (dr[name] != DBNull.Value && dr[name] != null){if (!DateTime.TryParse(dr[name].ToString(), out result))throw new Exception("日期格式数据转换失败");}return result;}/// <summary>          /// 获取可空类型日期数据         /// </summary>          /// <param name="dr"></param>         /// <param name="name"></param>         /// <returns></returns>          public static DateTime? GetNullDateTime(this DataRow dr, string name){DateTime? result = null;DateTime time = DateTime.Now;if (dr[name] != DBNull.Value && dr[name] != null){if (!DateTime.TryParse(dr[name].ToString(), out time))throw new Exception("日期格式数据转换失败");result = time;}return result;}/// <summary>          /// 获取guid类型数据         /// </summary>          /// <param name="dr"></param>         /// <param name="name"></param>         /// <returns></returns>          public static Guid GetGuid(this DataRow dr, string name){Guid guid = Guid.Empty;if (dr[name] != DBNull.Value && dr[name] != null){if (Guid.TryParse(dr[name].ToString(), out guid))throw new Exception("guid类型数据转换失败");}return guid;}/// <summary>         /// 获取整形数据         /// </summary>          /// <param name="dr"></param>         /// <param name="name"></param>         /// <returns></returns>         public static int GetInt32(this DataRow dr, string name){int result = 0;if (dr[name] != DBNull.Value && dr[name] != null){if (!int.TryParse(dr[name].ToString(), out result))throw new Exception("整形转换失败");}return result;}/// <summary>         /// 获取双精度类型数据 /// </summary>    /// <param name="dr"></param>   /// <param name="name"></param>     /// <returns></returns>          public static double GetDouble(this DataRow dr, string name){double result = 0.00;if (dr[name] != DBNull.Value && dr[name] != null){if (!double.TryParse(dr[name].ToString(), out result))throw new Exception("双精度类型转换失败");}return result;}/// <summary>          /// 获取单精度类型数据         /// </summary>          /// <param name="dr"></param>         /// <param name="name"></param>         /// <returns></returns>          public static float GetSingle(this DataRow dr, string name){float result = 0.00f;if (dr[name] != DBNull.Value && dr[name] != null){if (!float.TryParse(dr[name].ToString(), out result))throw new Exception("单精度类型转换失败");}return result;}/// <summary>          /// 获取decimal类型数据         /// </summary>          /// <param name="dr"></param>  /// <param name="name"></param>     /// <returns></returns>          public static decimal GetDecimal(this DataRow dr, string name){decimal result = 0.00m;if (dr[name] != DBNull.Value && dr[name] != null){if (!decimal.TryParse(dr[name].ToString(), out result))throw new Exception("Decimal类型转换失败");}return result;}/// <summary>          /// 获取int16类型数据         /// </summary>          /// <param name="dr"></param>         /// <param name="name"></param>         /// <returns></returns>          public static Int16 GetInt16(this DataRow dr, string name){short result = 0;if (dr[name] != DBNull.Value && dr[name] != null){if (!short.TryParse(dr[name].ToString(), out result))throw new Exception("短整形转换失败");}return result;}/// <summary>          /// 获取Byte类型数据         /// </summary> ///  <param name="dr"></param>         /// <param name="name"></param>         /// <returns></returns>          public static byte GetByte(this DataRow dr, string name){byte result = 0;if (dr[name] != DBNull.Value && dr[name] != null){if (!byte.TryParse(dr[name].ToString(), out result))throw new Exception("Byte类型转换失败");}return result;}/// <summary>          /// 获取bool类型数据如果传值是1或者是返回true;        /// </summary>          /// <param name="con"></param>         /// <param name="name"></param>         /// <returns></returns>          public static bool GetBool(this DataRow dr, string name){if (dr[name] != DBNull.Value && dr[name] != null){return dr[name].ToString() == "1" || dr[name].ToString() == "是" || dr[name].ToString().ToLower() == "true";}return false;}#endregion}

  

转载于:https://www.cnblogs.com/IlidanStormRage/p/5737062.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP单引号和双引号的区别

$foo 2; echo "foo is $foo"; // 打印结果: foo is 2 echo foo is $foo; // 打印结果: foo is $foo echo "foo is $foo\n"; // 打印结果: foo is 2 (同时换行) echo foo is $foo\n; // 打印结果: foo is $foo\n

美国科技界高度关注中国科技创新进展

来源&#xff1a;新华网近日&#xff0c;美国《福布斯》双周刊网站刊文说&#xff0c;中国互联网和高科技企业已超越模仿时代&#xff0c;成为投资和研发的全球领先者&#xff0c;中国的科技巨头进入了全新的创新时代。记者在采访中发现&#xff0c;美国科技界高度关注中国科技…

补鞋匠---Cobbler 服务器自动搭建

Cobbler 服务器自动搭建http://tshare365.com/archives/439.html转载于:https://www.cnblogs.com/iiiiher/p/5744631.html

科技创新2030—“新一代人工智能”重大项目拟立项的2018年度项目公示清单

来源&#xff1a;财政资金申请根据《国务院关于改进加强中央财政科研项目和资金管理的若干意见》&#xff08;国发[2014]11号&#xff09;、《国务院关于深化中央财政科技计划&#xff08;专项、基金等&#xff09;管理改革方案的通知》&#xff08;国发[2014]64号&#xff09;…

POSIX多线程API函数

创建 int pthread_create(pthread_t* tidp,const pthread_attr_t* attr,void* (*start_rtn)(void*), void* arg ) tidp:事先创建好的pthread_t类型的参数。成功时tidp指向的内存单元被设置为新创建线程的线程ID。 attr:定义新线程的一些属性&#xff08;配置项&#xff09;&…

python中分割字符串两种方法正则分组别名_Python 正则表达式(分组)

正则表达式分组分组就是用一对圆括号“()”括起来的正则表达式&#xff0c;匹配出的内容就表示一个分组。从正则表达式的左边开始看&#xff0c;看到的第一个左括号“(”表示第一个分组&#xff0c;第二个表示第二个分组&#xff0c;依次类推&#xff0c;需要注意的是&#xff…

SpringMVC核心——视图渲染(包含视图解析)问题

一、本来想说的是返回值处理问题&#xff0c;但在 SpringMVC 中&#xff0c;返回值处理问题的核心就是视图渲染。所以这里标题叫视图渲染问题。 本来想在上一篇文章中对视图解析进行说明的&#xff0c;但是通过源码发现&#xff0c;它应该算到视图渲染中&#xff0c;所以在这篇…

国际机器人联合会:全球工业机器人2019报告

来源&#xff1a;资本实验室据国际机器人联合会&#xff08;IFR&#xff09;最新发布的《全球机器人2019——工业机器人》报告数据&#xff0c;2018年全球工业机器人出货量42.2万台&#xff0c;比上年增长6%&#xff1b;年销售额达到165亿美元&#xff0c;创下新纪录。 IFR预测…

POSIX互斥锁api函数

初始化互斥锁 int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr); 参数attr指定了新建互斥锁的属性。如果参数attr为NULL&#xff0c;则使用默认的互斥锁属性。 锁定互斥锁 int pthread_mutex_lock(pthread_mutex_t *mutex); 当 pthread_…

mediarecorder添加时间戳_Python脚本实现数据处理(官方实例)和Hive自带时间函数...

官网示例官网地址&#xff1a;https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-ApacheWeblogData下载数据wget http://files.grouplens.org/datasets/movielens/ml-100k.zip我们下载好数据安装unzip yum install -y unzip解压数据创建库创建表…

从空城计到阿尔法狗,博弈论如何渗透我们的生活?

来源&#xff1a;返朴2016年&#xff0c;有那么一只“狗”大闹天宫&#xff0c;这在整个人类社会引起了轩然大波。它就是阿尔法狗&#xff08;AlphaGo&#xff09;&#xff0c;是谷歌&#xff08;Google&#xff09;旗下公司DeepMind 在人工智能与博弈论交叉研究上的一个杰作。…

POSIX条件变量API函数

初始化条件变量 int pthread_cond_init(pthread_cond_t *cond,const pthread_condattr_t *attr); 返回值&#xff1a;函数成功返回0&#xff1b;任何其他返回值都表示错误 初始化一个条件变量。当参数attr为空指针时&#xff0c;函数创建的是一个缺省的条件变量。 阻塞 in…

阶段性思考

算上在学校&#xff0c;学习前端已经两年了&#xff0c;但水平依旧不高&#xff0c;至今都只愿意钻研布局和交互&#xff0c;把兼容和动效玩得哈皮&#xff0c;但其实依旧没有装逼的自信。 也不得不回到当初的那个思考&#xff0c;如果只是做网页&#xff0c;又何必弄前端&…

反弹式木马原理_汽车避震器的原理与改装问题

一、避震器or避振器“震”字是指车轮在路面的滚动过程中&#xff0c;由于路面的不平&#xff0c;从路面传递上来的震动&#xff0c;而不是人为制造“振”动&#xff0c;所以使用“震”字更科学。二、避震器的工作原理避震器的工作原理是通过活塞运动产生阻尼力&#xff0c;将动…

科学探索奖首批50名获奖者都有谁?

来源&#xff1a;知识分子9月20日上午&#xff0c;经过四个多月的评审&#xff0c;2019年 获奖名单正式公布。来自全国26个科研单位、高校和企业的50位科学家成为首届“科学探索奖”获奖者&#xff0c;每人将在未来5年获得由腾讯基金会资助的300万元人民币。据悉&#xff0c;20…

python_递归原理

需要:  输出这样一些有规律数据: [0,1,1,2,3,5,8,13,21,34.......]看上面需要好像有一些规律&#xff0c;没错&#xff0c;就是大家熟悉的婓那波契数列,n(n-1)(n-2)如1385&#xff1b;运用递归原理得:def func(arg1,arg2): if arg1 0: print arg1,arg2 arg3 a…

POSIX信号量API函数

头文件&#xff1a;semaphore.h 初始化&#xff1a; int sem_init(sem_t *sem, int pshared, unsigned int value); sem_init() 初始化一个信号量&#xff0c;信号量对象为sem。value 参数指定信号量的初始值。 pshared 参数指明信号量是由进程内线程共享&#xff0c;还是由…

untitled软件怎么用_苹果手机怎么用4G网络于App Store下载超过200MB以上的软件

近两年来&#xff0c;随着苹果中国市场份额被国产品牌挤占了不少&#xff0c;他们越来越懂得“聆听”中国用家的需要&#xff0c;其中一项便是用手机网络(4G)下载iOS应用。在这一点上我们中国人也不用再妄自菲薄了&#xff0c;在疯狂的4G建网以后&#xff0c;我们国家已经拥有全…

关于人脸识别的最全研究!

来源&#xff1a;北京物联网智能技术应用协会本文内容涵盖人脸识别发展历程、市场研究、核心技术、商业应用以及产业落地、个人看法等干货研究。注意&#xff0c;本文干货满满&#xff0c;约有2万7千字&#xff0c;强烈建议大家先收藏后学习&#xff01;01 发展史1. 人脸识别的…

Stream学习过程中遇到的一个问题记录

Stream学习过程中遇到的一个问题记录 Test public void stream_modifiedV2(){List<String> strings Arrays.asList("aaa","bb","cc","dddddddddddddddddddddddddddddddd");Stream<String> stringStream strings.stream(…