当前位置: 代码迷 >> SQL >> 顺手写的一个对DataRow和DataSqlReader的扩展方法
  详细解决方案

顺手写的一个对DataRow和DataSqlReader的扩展方法

热度:59   发布时间:2016-05-05 10:30:19.0
随手写的一个对DataRow和DataSqlReader的扩展方法

因为觉得一般使用DataRow获取行数据时使用字符串 会有太多的不确定和类型判断所以想自己扩展一下

最后成果

    public class Model    {        public int objUserID { get; set; }        public string FirstName { get; set; }    }    class Program    {        static void Main(string[] args)        {            DataRow r = null;            var contact= r.GetContact<Model>();//声明一个DataRow的链接            //获取值类型            var id=contact.GetValue(s => s.objUserID,s=>int.Parse(s));            //获取引用类型            var name = contact.GetClassValue(s => s.FirstName);            //直接获取int类型            id = contact.GetValueByDBNull(s => s.objUserID);            System.Data.SqlClient.SqlDataReader reader = null;            contact = reader.GetContact<Model>();//声明一个SqlDataReader的链接            //获取值类型            id = contact.GetValue(s => s.objUserID);            //直接获取int类型            id = contact.GetValueByDBNull(s => s.objUserID);        }    }

开始定义一部分接口,公开外部可访问的方法


    public  interface ContactBase<T>    {        /// <summary>        /// 获取值类型        /// </summary>        TResult GetValue<TResult>(System.Linq.Expressions.Expression<Func<T, TResult>> exp, Func<string, TResult> convert=null);        /// <summary>        /// 获取引用类型        /// </summary>        TResult GetClassValue<TResult>(System.Linq.Expressions.Expression<Func<T, TResult>> exp,Func<object,TResult> convert=null)            where TResult :class;        /*获取指定类型*/        int GetValueByDBNull(System.Linq.Expressions.Expression<Func<T, int>> exp);        int GetValueByDBNull(System.Linq.Expressions.Expression<Func<T, double>> exp);        int GetValueByDBNull(System.Linq.Expressions.Expression<Func<T, string>> exp);    }

然后写根据接口定义的抽象类,里面写一些工具方法和公共属性

    public abstract class ContactTools<T,TData>:ContactBase<T>    {        /// <summary>        /// 存放row或reader的值        /// </summary>        private TData _data;        protected ContactTools(TData data)        {            this._data = data;        }        /// <summary>        /// 通过lambda获取row或reader值        /// </summary>        private object GetDBValue<TResult>(System.Linq.Expressions.Expression<Func<T, TResult>> exp, Func<string, object> getFunc)        {            if (exp == null || getFunc == null)                return default(TResult);            var member = exp.Body as System.Linq.Expressions.MemberExpression;            var name = member.Member.Name;            return getFunc(name);        }        /// <summary>        /// 需要继承的改变        /// </summary>        public abstract virtual object GetData(TData data,string name);        public TResult GetValue<TResult>(System.Linq.Expressions.Expression<Func<T, TResult>> exp, Func<string, TResult> convert = null)        {            var value = this.GetDBValue(exp,s=>this.GetData(this._data,s));            if (value == DBNull.Value)                return default(TResult);            if (string.IsNullOrEmpty(value.ToString()))                return default(TResult);            if (convert == null)                return (TResult)value;            else                return convert(value.ToString());        }        public TResult GetClassValue<TResult>(System.Linq.Expressions.Expression<Func<T, TResult>> exp, Func<object, TResult> convert = null)            where TResult : class        {            var value = this.GetDBValue(exp, s => this.GetData(this._data, s));            if (value == DBNull.Value)                return null;            if (convert == null)                return value as TResult;            else                return convert(value);        }        public int GetValueByDBNull(System.Linq.Expressions.Expression<Func<T, int>> exp)        {            return this.GetValue(exp, s => int.Parse(s));        }        public double GetValueByDBNull(System.Linq.Expressions.Expression<Func<T, double>> exp)        {            return this.GetValue(exp, s => double.Parse(s));        }        public string GetValueByDBNull(System.Linq.Expressions.Expression<Func<T, string>> exp)        {            var str =this.GetClassValue(exp);            return str == null ? string.Empty : str;        }    }


然后实现DataRow

    public class DataRowContact<T> : ContactTools<T, DataRow>    {        public DataRowContact(DataRow row):base(row){}        public override object GetData(DataRow data, string name)        {            return data[name];        }    }

实现DataSqlReader
    public class DataReaderContact<T> : ContactTools<T, System.Data.SqlClient.SqlDataReader>    {        public DataReaderContact(System.Data.SqlClient.SqlDataReader reader) : base(reader) { }        public override object GetData(System.Data.SqlClient.SqlDataReader data, string name)        {            return data[name];        }    }

最后写扩展方法,扩展到DataRow和DataSqlReader中

    public static class MyLinq    {        public static ContactBase<T> GetContact<T>(this DataRow row)        {            return new DataRowContact<T>(row);        }        public static ContactBase<T> GetContact<T>(this System.Data.SqlClient.SqlDataReader reader)        {            return new DataReaderContact<T>(reader);        }    }