再不用担心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的地方.可是不行,不能解决我的问题!!!!!!!!!!! 网上是这样说的: ######这为引用### ...
随机推荐
- [SAP ABAP开发技术总结]字段符号FIELD-SYMBOLS
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- hdu 4828 Grids 卡特兰数+逆元
Grids Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Problem D ...
- Python基础学习笔记(十一)函数、模块与包
参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-functions.html 3. http://www.liao ...
- uploads 上传图片
public static function upFile($r,$p='../images/link/',$type='gif,jpg,png',$named=0){ $newnames = nul ...
- idea编辑器HttpServlet httpServlet = ServletActionContext.getServletContext().getRealPath();方法无法使用
HttpServlet httpServlet = ServletActionContext.getServletContext().getRealPath(); 前几天在使用idea的时候发现这个方 ...
- jQuery的deferred对象
应用场景:处理异步任务 看到一篇阮一峰老师的博客挺好的讲的就是jQuery的deferred对象.坦诚讲之前没有怎么用过这个东东呢. 摘其中几点记录下 (1) $.Deferred() 生成一个def ...
- JS实现复选框全选全不选以及子复选框带动全选框的选中
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 自定义获取焦点的TextView
自定义控件编写流程 创建一个默认就能获取焦点的TextView 1.创建一个类继承至TextView,FocusTextView 2.重写其构造方法 //使用在通过java代码创建控件 public ...
- UIImageView 的contentMode属性
UIViewContentModeScaleToFill UIViewContentModeScaleAspectFit UIViewContentModeScaleAspectFill UIView ...
- iOS开发之Xcode 如何使用API帮助
内容转载自<iOS开发指南 2.6.2 如何使用API帮助> 对于一个初学者来说,学会在Xcode中使用API帮助文档是非常重要的.下面我们通过一个例子来介绍API帮助文档的用法.在编写H ...