个人SqlHelper类

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;

public static class SqlHelper
{
    //读取配置文件,获得连接字符串
    static readonly string URL = ConfigurationManager.AppSettings["connStr"];

    //  获得连接实例
    static SqlConnection getConn()
    {
        SqlConnection conn = new SqlConnection(URL);
        conn.Open();
        return conn;
    }

    /// <summary>
    /// 执行更行
    /// </summary>
    /// <param name="sql">T-SQL语句</param>
    /// <param name="ps">填充占位符的参数,长度可变数组</param>
    public static bool ExeUpdate(string sql, params SqlParameter[] ps)
    {
        using (SqlConnection conn = getConn())
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddRange(ps);
            try
            {
                return cmd.ExecuteNonQuery() > 0;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }
    }

    /// <summary>
    /// 返回首行首列(查某个属性)
    /// </summary>
    public static object ExeScalar(string sql, params SqlParameter[] ps)
    {
        using (SqlConnection conn = getConn())
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddRange(ps);
            return cmd.ExecuteScalar();
        }
    }

    #region Hashtable
    ////  hash键值对方式,返回一行数据
    //public static Hashtable getOneRow(string sql)
    //{
    //    using (SqlConnection conn = getConn())
    //    {
    //        SqlDataReader aReader = new SqlCommand(sql, conn).ExecuteReader();

    //        Hashtable hs = new Hashtable();

    //        if (aReader.Read()) //至多有一行数据
    //        {
    //            for (int i = 0; i < aReader.FieldCount; i++)
    //            {
    //                hs.Add(aReader.GetName(i), aReader[i]);
    //            }
    //        }

    //        return hs;
    //    }
    //}
    #endregion

    #region List<Hash>
    ////  返回List<Hash>集合。SqlDataReader方式读取,获取具体对象时必须先拆箱(向下转型)。
    //public static List<Hashtable> getAll(string sql)
    //{
    //    using (SqlConnection conn = getConn())
    //    {
    //        List<Hashtable> list = new List<Hashtable>();
    //        SqlDataReader aReader = new SqlCommand(sql, conn).ExecuteReader();
    //        aReader.GetSchemaTable(); //  直接返回 DataTable 数据集(列名是不确定的)
    //        while (aReader.Read())
    //        {
    //            Hashtable hash = new Hashtable();   //  aReader.GetValues();

    //            for (int i = 0; i < aReader.FieldCount; i++)
    //            {
    //                hash.Add(aReader.GetName(i), aReader[i]);   // Add(列名,列值)
    //            }
    //            list.Add(hash);
    //        }
    //        return list;
    //    }
    //}
    #endregion

    #region IList<T>
    /// <summary>
    /// 利用泛型与反射,实现 返回任意对象结果集
    /// </summary>
    /// <typeparam name="T">指定一个实例</typeparam>
    public static IList<T> GetList<T>(string sql) where T : new()    //约束必须有一个构造
    {
        using (SqlConnection conn = getConn())
        {
            IList<T> list = new List<T>();   // 定义一个泛型集合

            SqlDataReader aReader = new SqlCommand(sql, conn).ExecuteReader();

            //反射入口,获取 该实例的所有公共属性
            PropertyInfo[] props = typeof(T).GetProperties();

            while (aReader.Read())
            {
                T newInstance = new T();  // 申明一个新实例

                #region 给属性设置

                props.ToList().ForEach(p =>
                {
                    object value = null;
                    try
                    {
                        value = aReader[p.Name];
                    }
                    catch (IndexOutOfRangeException) { value = null; }
                    finally
                    {
                        if (value != DBNull.Value) p.SetValue(newInstance, value, null);
                    }
                });

                //foreach (PropertyInfo field in props)
                //{
                //    string name = field.Name;
                //    object value = null;
                //    try
                //    {
                //        value = aReader[name];
                //    }
                //    catch (IndexOutOfRangeException)
                //    { value = null; }     //  实体类映射有误!
                //    finally
                //    {
                //        if (value != DBNull.Value)
                //            field.SetValue(newInstance, value, null);
                //    }
                //}
                #endregion

                list.Add(newInstance);  // 将当前实例添加到集合中
            }

            return list;
        }
    }
    #endregion

    /// <summary>
    /// 返回 DataTable 数据集。SqlDataAdapter方式填充。
    /// </summary>
    public static DataTable GetTab(string sql, params SqlParameter[] ps)
    {
        SqlCommand cmd = new SqlCommand(sql, getConn());
        cmd.Parameters.AddRange(ps);
        DataTable dt = new DataTable();
        new SqlDataAdapter(cmd).Fill(dt);
        return dt;
    }

    /// <summary>
    /// DataTable 转换为List<T>集合
    /// </summary>
    public static IList<T> ToList<T>(string sql, params SqlParameter[] ps) where T : class, new()
    {
        DataTable dt = GetTab(sql, ps);

        var prlist = new List<PropertyInfo>();  //  创建一个属性列表的集合

        //获得 T 的所有的公开属性的数组,并将和DataTable一致列的属性加入prlist集合
        Array.ForEach(typeof(T).GetProperties(), p => { if (dt.Columns.Contains(p.Name)) prlist.Add(p); });

        //创建返回的集合
        var list = new List<T>();

        //给对象设值
        foreach (DataRow row in dt.Rows)
        {
            var obj = new T();  //  创建 T 的实例

            //给T的对应属性赋值
            prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(obj, row[p.Name], null); });

            list.Add(obj);  //添加到返回的集合中
        }

        return list;
    }

}


你可能感兴趣的:(个人SqlHelper类)