在使用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

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

  1. 出门在外再不用担心手机没电,华为三款移动电源总有一个适合你

    现代社会,几乎已经人手一部手机了,有的人甚至同时使用多部,不过随着手机功能越来越多.使用的频率越来越高,手机的续航能力成为了困扰用户的一个问题,电量越来越供给不上,如果是玩游戏的话耗电速度更快,所以出 ...

  2. 伪装成计算机器的加密app,给手机设置“伪装加密”,再不用担心被偷看!

    生活中,我们的手机难免会被借走,可能出现信息被翻,隐私被偷窥的情况,相信这是很多小伙伴会遇到的问题.那么,如何保护好自己手机里的隐私呢? 今天给大家带来一款加密神器,它可以将你手机里的隐私内容藏在一个 ...

  3. 有这样一支小笔,再不用担心喝到假酒了...

    假如,给你两杯可乐.两个苹果.两颗红宝石和两粒药丸. 你怎么判断,哪杯可乐是无糖的.哪个苹果更甜.哪颗宝石是真的.哪粒药丸是安全的...... 可乐和苹果可以通过尝尝以分辨,但宝石和药片还是不要啃了. ...

  4. 流程图不会画?不用担心,使用在线网站绘制流程图简单方法介绍

    流程图的使用是帮助绘制者将一件事情的操作方法,操作流程进行绘制,这样在对这件事进行实战操作时就会让大家可以更快的接受这件事情,从而获得更高的准确率,那怎样使用画图工具绘制流程图呢? 1.在绘制时我们主 ...

  5. C语言大学期末考试重点,快点码住,再也不用担心挂科啦

    很多萌新一到大学就玩嗨了,C语言到期末了还一窍不通,小编这次整理了大学期末考试的考试重点,让你考前冲刺,妈妈再也不用担心我的学习啦~挂科对大学生的坏处可想而知,不仅会被取消奖学金,评优评先也没有资格参 ...

  6. sql注入及用PrepareStatement就不用担心sql注入了吗?

    首先讲一下sql注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQ ...

  7. 【PC工具】chrome浏览器插件vimium:传说上网可以不用鼠标。VIM入门工具,妈妈再也不用担心我学不会vim了...

    vim是一个神奇的编辑器,很多大神都用这个编辑器,大神们一般不太爱不用鼠标,如果运气好可以看到大神写代码,那简直是快的飞起的感觉. 想当年我也励志要学习使用vim,脑子不太好记不住快捷键,加上写程序一 ...

  8. bilibili有电脑版吗_你体验过电脑版的《和平精英》吗?不用担心内存,也不用担心卡顿...

    大家好,欢迎来到<刺激实战教室>,我是你们的老朋友刺激哥.不知道大家在玩<和平精英>的时候,有没有体验过电脑版的<和平精英>. 刺激哥在搜索<和平精英> ...

  9. 看完这一篇,再也不用担心 Git 的“黑魔法”

    简介: 相信大部分开发者对 Git 都不陌生,Git 也已成为大部分开发者日常开发必用的工具.本文分享 Git 使用上的一些基础知识,通俗易懂,非常有用. 更多相关内容:点击这里​ 在 Git Rev ...

最新文章

  1. fragment类onresume里面刷新操作处理
  2. java类库帮助文档,薪资翻倍
  3. 如何实施异构服务器的负载均衡及过载保护?
  4. 3.3 前向传播与反向传播-机器学习笔记-斯坦福吴恩达教授
  5. js 字符串操作函数有哪些
  6. JVM参数设置、分析(转)
  7. 安卓第一次搭建C/S架构
  8. 学计算机必须学会模拟电路,2016年广西大学计算机与电子信息学院1304电路分析基础与模拟电子线路之电路分析基础复试笔试仿真模拟题...
  9. [转]Oracle SQL 日期的應用
  10. ajax传输 基础一
  11. RadarNet: Efficient Gesture Recognition Technique Utilizing a Miniaturized Radar Sensor
  12. TH75 V2 双模蓝牙5.2热插拔PCB
  13. C#学习笔记:子类于父类的构造函数的关系【By Myself】
  14. flink jdbc connector支持clickhouse
  15. 在不支持PAE的机器上装Linux(Ubuntu)的方法
  16. RecyclerView与ViewPager2
  17. 一个Linux病毒艰辛短暂的一生
  18. python Dataframe apply()自定义函数中axis参数
  19. 5. VBA消息框(MsgBox)
  20. 架设网站php,初次架设PHP网站

热门文章

  1. #串口通信超时处理_【学院推荐】划重点!LabVIEW中串口参数需注意的几点
  2. python的groupby中函数详解_python groupby函数用法
  3. moment获取几小时前_momentjs – 使用时刻在两个日期时间之间获得hh:mm的时差
  4. 转结构体_golang处理gb2312转utf8编码的问题
  5. ddd架构 无法重构_漫谈分层架构:为什么要进行架构分层?
  6. gmod的css模块放哪里,webpack打包css报错找不到模块?
  7. gmail注册手机号不能用于验证_注册Google帐户手机号无法验证的问题
  8. Java中使用Jedis连接Redis对String进行操作的常用命令
  9. Dubbo环境搭建-管理控制台dubbo-admin实现服务监控
  10. Winform中实现ZedGraph滚轮缩放后自动重新加载数据