再不用担心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的地方.可是不行,不能解决我的问题!!!!!!!!!!! 网上是这样说的: ######这为引用### ...
随机推荐
- Download file using libcurl in C/C++
http://stackoverflow.com/questions/1636333/download-file-using-libcurl-in-c-c #include <stdio.h&g ...
- windows跟linux文件共享
方法一:windows下的winscp工具 前提条件:windows能够ping通linux:linux关闭防火墙,/etc/init.d/iptables stop 在windows下运行winsc ...
- sqlserver2008创建数据库 报 Cannot read property is filestream 此属性不可用于sql server 7.0 解决
在创建数据库的时候,报整个错误 Cannot read property is filestream 此属性不可用于sql server 7.0 按照网上的方法 (http://blog.csdn. ...
- iOS添加广告的主要方法
//用户取消正在执行的广告时 调用 - (void)cancelBannerViewAction { NSLog(@"Banner was cancelled!"); self.a ...
- iOS : 静态库(.framework)合并
如果写了一个Framework,根据Build时选择的机器类型,会分为模拟器Framework和真机Framework,两者是不能混用的. 此时可以通过配置一个Run Script,在Script中使 ...
- Domion OA 日记
我现在使用的是IBM的 Lotus Dimion 8.5 以下内容是个人的浅显了解,在此记录下,已作为后续记录的翻看 第一次接触文档型数据库,确实颠覆了我对数据模型的认知,我之前一直用sql的 文档型 ...
- jQuery.validate.js+API_cn
名称 返回类型 描述 validate(options) 返回:Validator 验证所选的FORM valid() 返回:Boolean 检查是否验证通过 rules() 返回:Options ...
- 07 concurrency and Multi-version
本章提要---------------------------------------------------------对并发和锁的进一步补充并发控制事务的隔离级别多版本控制读一致性的含义写一致性- ...
- nexus 2.6需要jdk7才能跑起来
Java 6 Support EOLOracle's support for Java 6 ended in February 2013. Consequentially as of version ...
- 【服务器防护】WEB防护 - WEBSHELL攻击探测【转载】
原文:http://www.2cto.com/Article/201511/451757.html 1. 什么是webshell? 基于b/s架构的软件部署在Internet上,那么安全性是必 ...