再不用担心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的地方.可是不行,不能解决我的问题!!!!!!!!!!! 网上是这样说的: ######这为引用### ...
随机推荐
- 让PHP 5.3支持MSSQL连接
最近在Windows Server 2008配置了PHP环境,想要连接SQL Server 2008,但是悲催的发现,从5.3开始,PHP自带的dll不再支持2000以后的MS SQL Server了 ...
- mimikatz2.0抓取WINDOWS密码
看吾爱的,刚好问同事说这个也用过,以后内网渗透的话比较方便 http://www.52pojie.cn/thread-264895-1-1.html ========================= ...
- SQL 根据指定字符拆分字符串
CREATE FUNCTION [dbo].[F_StringSplit] ( @STR NVARCHAR(MAX)='', )='') )) AS BEGIN DECLARE @NUM INT, @ ...
- CUBRID学习笔记 44 UPDATE 触发器 更新多表 教程
cubrid的中sql查询语法UPDATE c#,net,cubrid,教程,学习,笔记欢迎转载 ,转载时请保留作者信息.本文版权归本人所有,如有任何问题,请与我联系wang2650@sohu.com ...
- C#中Monitor和Lock以及区别
Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...
- weblogic与axis2 jar包冲突
1.org.springframework.web.util.NestedServletException: Handler processing failed; nested exception i ...
- git原理图解
本文背景,在实际项目中使用git已有一年,发现不少同事虽然会使用常用git指令,但并不理解每个指令对应的作用原理.今天静下心总结下git 的基本理解:代码的存在区域:本文以实际项目出发,理清使用git ...
- Eclipse使用Jetty(转)
eclipse 与 jetty 结合的最佳实践 http://www.cnblogs.com/mignet/archive/2011/12/04/eclipse_jetty_perfect_integ ...
- mysql概要(十四)索引(补充:外键级联操作)
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ][ ON UPDATE { NO ACTION | CASCADE | SE ...
- JSP的隐式对象
JSP支持九个自动定义的变量,江湖人称隐含对象.这九个隐含对象的简介见下表: 参考资料:http://www.runoob.com/jsp/jsp-syntax.html