你的位置:首页 > ASP.net教程

[ASP.net教程]再不用担心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 更加方便

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  }