微软企业库6DataAccessApplicationBlock扩展(二)

2015-07-24 08:59:03 · 作者: · 浏览: 1
parameterMapperAction, Func resultSetMapperFunc, params object[] parameterValues) { IParameterMapper parameterMapper = new GeneralParameterMapper(parameterMapperAction); IResultSetMapper resultSetMapper = new GeneralResultSetMapper(resultSetMapperFunc); return db.CreateSqlStringAccessor(sql, parameterMapper, resultSetMapper).Execute(parameterValues).ToList(); } }顺带补充个通用的Data扩展

    /// 
    /// 数据相关的帮助类
    /// 
    public static class DbHelper
    {
        /// 
        /// 从DataReader中读取可空对象
        /// 
        /// 泛型T
        /// IDataReader
        /// Key
        /// 
        public static Nullable GetNullable(this IDataRecord dr, string key)
            where T : struct
        {
            return dr[key] == null || dr[key] == DBNull.Value ? (Nullable)null : (T)dr[key];
        }
        /// 
        /// 当DataReader读取对象为空时,返回defaultValue
        /// 
        /// 泛型T
        /// IDataReader
        /// Key
        /// 当取到的数据为DBNull时,应当返回的默认值
        /// 
        public static T GetDefaultWhileNullable(this IDataRecord dr, string key, T defaultValue = default(T))
        {
            return dr[key] == null || dr[key] == DBNull.Value ? defaultValue : (T)dr[key];
        }
        /// 
        /// 从DataReader中读取字符串并除前后空白字符后
        /// 
        /// IDataReader
        /// Key
        /// 
        public static string GetTrimedString(this IDataRecord dr, string key)
        {
            return dr[key].ToString().Trim();
        }
    }

具体使用代码如下:

string sql = @"SELECT [pdate]
      ,[pbegtime]
      ,[pendtime]
      ,[pid]
      ,[pdateid] FROM tbltime WITH(NOLOCK)
WHERE pid=@PID";

            IRowMapper rowMapper = MapBuilder.MapNoProperties()
                .Map(p => p.ID).ToColumn("pdateid")
                .Map(p => p.Name).WithFunc((dr) =>
                {
                    return string.Format("{0}-{1}", dr.GetTrimedString("pbegtime"), dr.GetTrimedString("pendtime"));
                })
                .Build();
            var list = db.ExecuteBySqlString(sql, null, rowMapper, new SqlParameter("@PID", 12345) { DbType = DbType.Int32 });

            MessageBox.Show(list.Count.ToString());


            IParameterMapper paramterMapper = new GeneralParameterMapper();
            var _productAccessor = db.CreateSqlStringAccessor(sql, paramterMapper, rowMapper);

            var products = _productAccessor.Execute(new SqlParameter("@PID", 12345) { DbType = DbType.Int32 }).ToList();
            if (products != null && products.Count > 0)
            {
                MessageBox.Show(products.Count.ToString());
            }