再不用担心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 更加方便
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
}
再不用担心DataRow类型转换和空值了(使用扩展方法解决高频问题)的更多相关文章
- (转)再不用担心DataRow类型转换和空值了(使用扩展方法解决高频问题)
再不用担心DataRow类型转换和空值了(使用扩展方法解决高频问题) XML文档操作集锦(C#篇) webapi文档描述-swagger
- 通过server酱实现定时推送天气情况,再不用担心你的糊涂蛋女友忘带伞了~~
昨天菜鸟小白给大家留了一个课后作业,如何实现天气的定时推送.有没有小伙伴做出来答案呢?今天菜鸟小白给大家分享我的实现方式吧.这个是我今天整的程序流程图,昨天我们还只是实现了中间的通过和风天气API获取 ...
- 锋利的js之妈妈再也不用担心我找错钱了
用js实现收银功能. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...
- 理解Linux文档的默认安全机制、隐藏属性、特殊权限,妈妈在也不用担心你从删库到跑路!!!
写在前面 前面的章节 详解Linux文档属性.拥有者.群组.权限.差异,介绍了文档的基本权限,包括读写执行(r,w,x),还有文档若干的属性,包括是否为目录(d).文件(-).链接文件(l).拥有者. ...
- JavaScript黑客是这样窃取比特币的,Vue开发者不用担心!
如果你是JavaScript或者区块链开发者,如果你有关注区块链以及比特币,那么你应该听说了比特币钱包Copay被黑客攻击的事情.但是,你知道这是怎么回事吗? 总结 比特币钱包copay依赖event ...
- 有了 tldr,妈妈再也不用担心我记不住命令了
引言 有一次我在培训时说「程序员要善于使用 Terminal 以提高开发效率」,一位程序员反驳道:「这是 21 世纪,我们为什么要用落后的命令行,而不是先进的 GUI?」 是的,在一些人眼里,这个黑黑 ...
- 妈妈再也不用担心我使用git了
妈妈再也不用担心我使用git了 Dec 29, 2014 git git由于其灵活,速度快,离线工作等特点而倍受青睐,下面一步步来总结下git的基本命令和常用操作. 安装msysgit 下载地址:ms ...
- 利用CH341A编程器刷新BIOS,恢复BIOS,妈妈再也不用担心BIOS刷坏了
前几天,修电脑主析就捣鼓刷BIOS,结果刷完黑屏开不了机,立刻意识到完了,BIOS刷错了.就从网上查资料,各种方法试了个遍,什么用处都没有.终于功夫不负有心人,找到了编码器,知道了怎么用.下面看看具体 ...
- 如何在任意文件下启动jupyter notebook,而不用担心环境配置问题
网上看了很多帖子,说可以写一个bat文件,将bat文件放在你想启动jupyter notebook的地方.可是不行,不能解决我的问题!!!!!!!!!!! 网上是这样说的: ######这为引用### ...
随机推荐
- Creating Excel File in Oracle Forms
Below is the example to create an excel file in Oracle Forms.Pass the Sql query string to the below ...
- Servlet上下文
Servlet上下文 运行在Java虚拟机的每一个Web应用程序都有一个与之相关的Servlet上下文. Java Servlet API提供了一个ServletContext接口来表示上下文.在这个 ...
- emacs学习
(set-default-font "Consolas-14") // 设置字体及其大小 M-数字 命令 C-数字 命令
- C#线程系列讲座(5):同步技术之Monitor
在上一讲介绍了使用lock来实现线程之间的同步.实际上,这个lock是C#的一个障眼法,在C#编译器编译lock语句时,将其编译成了调用Monitor类.先看看下面的C#源代码: public sta ...
- 一个js(javascript)使用案例
<script type="text/javascript"> var Row; $(function () { // $("#Sel").clic ...
- [转]-用Gradle 构建你的android程序
出处:http://www.cnblogs.com/youxilua 前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android studio 用的是gr ...
- mongoDB 类型参考表
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. MongoDB 中可以使用的类型如下表所示: 参考资料:http://www.runoob.com/mongodb/mong ...
- linux学习笔记2-命令总结3
文件搜索命令 1.文件搜索命令 find 2.其他文件搜索命令 grep - 在文件中搜索字串匹配的行并输出 locate - 在文件资料库中查找文件 whereis - 搜索命令所在目录及帮助文档路 ...
- Struts1 标签库 说明
Struts提供了五个标签库,即:HTML.Bean.Logic.Template和Nested. HTML标签 : 用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单 ...
- Android设置Activity启动和退出时的动画
业务开发时遇到的一个小特技,要求实现Activity启动时自下向上弹出,退出时自上向下退出. 此处不关注启动和退出时其他Activity的动画效果,实现方法有两种: 1.代码方式,通过Activity ...