访问SQLServer的通用DAL层

首先是DataTable转List<T>的方法,这个方法通用性极强.
#region Table转List
        /// <summary>
        /// Table转List
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static List<T> TableToList<T>(DataTable dt) where T : new()
        {
            // 定义集合
            IList<T> list = new List<T>();

            // 获得此模型的类型
            Type type = typeof(T);

            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();

                // 获得公共属性
                PropertyInfo[] propertys = t.GetType().GetProperties();

                foreach (PropertyInfo pi in propertys)
                {
                    // 判断此属性是否有Setter
                    if (!pi.CanWrite) continue;

                    object value = dr[pi.Name];
                    if (value != DBNull.Value)
                        pi.SetValue(t, value, null);
                }

                list.Add(t);
            }
            return list.ToList();
        }
        #endregion
/// <summary>
    /// 数据访问基类:BaseService
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class BaseService<T> : IBaseService<T> where T : class ,new()
    {
        /// <summary>
        /// 得到某列最大值
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="fieldname"></param>
        /// <returns></returns>
        public virtual int GetMax(string connection,string fieldname)
        {
            #region 参数
            T entity = new T();
            SqlParameter[] parameters = new SqlParameter[]
            {
                new SqlParameter("@fieldname",fieldname)
            }; 
            #endregion

            StringBuilder sqlStr=new StringBuilder();
            sqlStr.Append("select max(");
            sqlStr.Append("@fieldname");
            sqlStr.Append(") from ");
            sqlStr.Append(entity.GetType().Name);

            return int.Parse(DatabaseAccess.SqlHelper.ExecuteDataSetText(connection, sqlStr.ToString(), parameters).Tables[0].Rows[0][0].ToString());
        }

        /// <summary>
        /// 是否存在该记录
        /// </summary>
        /// <param name="connection">连接字符串</param>
        /// <param name="primarykey">主键值</param>
        /// <returns></returns>
        public virtual bool Exists(string connection, object primarykey)
        {
            #region 参数
            T entity = new T();

            string primaryKey = GetPrimarykey(connection, entity);
            List<SqlParameter> parameters = new List<SqlParameter>();
            parameters.Add(new SqlParameter("@" + primaryKey, primarykey));
            #endregion

            StringBuilder sqlStr = new StringBuilder();
            sqlStr.Append("select count(1) from ");
            sqlStr.Append(entity.GetType().Name);
            sqlStr.Append(" where ");
            sqlStr.Append(primaryKey + "=@" + primaryKey);

            int res = DatabaseAccess.SqlHelper.ExecteNonQueryText(connection, sqlStr.ToString(), parameters.ToArray());
            if (res > 0)
                return true;
            else
                return false;
        }

        /// <summary>
        /// 增加一条数据
        /// </summary>
        public virtual bool Add(string connection, T entity)
        {
            #region 参数
            List<SqlParameter> parameters = new List<SqlParameter>();
            string fields = "";
            string placeholders = "";
            foreach (var item in entity.GetType().GetProperties())
            {
                fields += item.Name + ",";
                placeholders += "@" + item.Name + ",";

                SqlParameter parameter = new SqlParameter();
                parameter.ParameterName = "@" + item.Name;
                parameter.Value = item.GetValue(entity, null);
                parameters.Add(parameter);
            }
            #endregion

            StringBuilder sqlStr = new StringBuilder();
            sqlStr.Append("insert " + entity.GetType().Name + " (");
            sqlStr.Append(fields.Substring(0, fields.Length - 1) + ")");
            sqlStr.Append(" values (");
            sqlStr.Append(placeholders.Substring(0, placeholders.Length - 1) + ")");

            int res = DatabaseAccess.SqlHelper.ExecteNonQueryText(connection, sqlStr.ToString(), parameters.ToArray());
            if (res > 0)
                return true;
            else
                return false;
        }

        /// <summary>
        /// 更新一条数据
        /// </summary>
        /// <param name="connection">连接字符串</param>
        /// <param name="entity">类</param>
        /// <returns></returns>
        public virtual bool Update(string connection, T entity)
        {
            #region 参数
            string primaryKey = GetPrimarykey(connection, entity);
            List<SqlParameter> parameters = new List<SqlParameter>();
            parameters.Add(new SqlParameter("@"+primaryKey, entity.GetType().GetProperty(primaryKey).GetValue(entity,null)));
            string fields = "";
            foreach (var item in entity.GetType().GetProperties())
            {
                if (item.Name != primaryKey)
                {
                    fields += item.Name + "=@" + item.Name + ",";

                    SqlParameter parameter = new SqlParameter();
                    parameter.ParameterName = "@" + item.Name;
                    parameter.Value = item.GetValue(entity, null);
                    parameters.Add(parameter);
                }
            }
            #endregion

            StringBuilder sqlStr = new StringBuilder();
            sqlStr.Append("update " + entity.GetType().Name);
            sqlStr.Append(" set ");
            sqlStr.Append(fields.Substring(0,fields.Length-1));
            sqlStr.Append(" where ");
            sqlStr.Append(primaryKey + "=@" + primaryKey);

            int res = DatabaseAccess.SqlHelper.ExecteNonQueryText(connection, sqlStr.ToString(), parameters.ToArray());
            if (res > 0)
                return true;
            else
                return false;
        }

        /// <summary>
        /// 删除一条数据
        /// </summary>
        /// <param name="connection">连接字符串</param>
        /// <param name="primaryKey">主键值</param>
        /// <returns></returns>
        public virtual bool Delete(string connection, object primarykey)
        {
            #region 参数
            T entity = new T();

            string primaryKey = GetPrimarykey(connection, entity);
            List<SqlParameter> parameters = new List<SqlParameter>();
            parameters.Add(new SqlParameter("@" + primaryKey, primarykey)); 
            #endregion

            StringBuilder sqlStr = new StringBuilder();
            sqlStr.Append("delete from ");
            sqlStr.Append(entity.GetType().Name);
            sqlStr.Append(" where ");
            sqlStr.Append(primaryKey + "=@" + primaryKey);

            int res = DatabaseAccess.SqlHelper.ExecteNonQueryText(connection, sqlStr.ToString(), parameters.ToArray());
            if (res > 0)
                return true;
            else
                return false;
        }

        /// <summary>
        /// 删除多条数据
        /// </summary>
        /// <param name="connection">连接字符串</param>
        /// <param name="base_idlist">主键值列表</param>
        /// <returns></returns>
        public virtual bool DeleteList(string connection, List<object> primarykeys)
        {
            #region 参数
            T entity = new T();

            string primaryKey = GetPrimarykey(connection, entity);

            string primaryKeys = "";
            foreach(var item in primarykeys)
            {
                primaryKeys += item.ToString();
            }

            List<SqlParameter> parameters = new List<SqlParameter>();
            parameters.Add(new SqlParameter("@" + primaryKey, primaryKeys));
            #endregion

            StringBuilder sqlStr = new StringBuilder();
            sqlStr.Append("delete from ");
            sqlStr.Append(entity.GetType().Name);
            sqlStr.Append(" where ");
            sqlStr.Append(primaryKey + " in(@" + primaryKey + ")");

            int res = DatabaseAccess.SqlHelper.ExecteNonQueryText(connection, sqlStr.ToString(), parameters.ToArray());
            if (res > 0)
                return true;
            else
                return false;
        }

        /// <summary>
        /// 得到一个对象实体
        /// </summary>
        /// <param name="connection">连接字符串</param>
        /// <param name="primarykey">主键值</param>
        /// <returns></returns>
        public virtual T GetModel(string connection, object primarykey)
        {
            #region 参数
            T entity = new T();

            string primaryKey = GetPrimarykey(connection, entity);

            List<SqlParameter> parameters = new List<SqlParameter>();
            parameters.Add(new SqlParameter("@table", entity.GetType().Name));
            parameters.Add(new SqlParameter("@" + primaryKey, primarykey)); 
            #endregion

            StringBuilder sqlStr = new StringBuilder();
            sqlStr.Append("select * from ");
            sqlStr.Append(entity.GetType().Name);
            sqlStr.Append(" where ");
            sqlStr.Append(primaryKey + "=@" + primaryKey);

            return Common.ToList.TableToList<T>(DatabaseAccess.SqlHelper.ExecuteDataSetText(connection, sqlStr.ToString(), parameters.ToArray()).Tables[0]).FirstOrDefault();
        }

        /// <summary>
        /// 获得数据列表
        /// </summary>
        /// <param name="connection">连接字符串</param>
        /// <param name="strWhere">查询条件</param>
        /// <returns></returns>
        public virtual List<T> GetList(string connection, string strWhere)
        {
            #region 参数
            T entity = new T();

            List<SqlParameter> parameters = new List<SqlParameter>();
            parameters.Add(new SqlParameter("@where", strWhere));
            #endregion

            StringBuilder sqlStr = new StringBuilder();
            sqlStr.Append("select * from ");
            sqlStr.Append(entity.GetType().Name);
            if (strWhere.Trim().Length > 0)
                sqlStr.Append(" where @where");

            return Common.ToList.TableToList<T>(DatabaseAccess.SqlHelper.ExecuteDataSetText(connection, sqlStr.ToString(), parameters.ToArray()).Tables[0]);
        }

        /// <summary>
        /// 获得总数
        /// </summary>
        /// <param name="connection">连接字符串</param>
        /// <param name="strWhere">查询条件</param>
        /// <returns></returns>
        public virtual int GetRecordCount(string connection, string strWhere)
        {
            #region 参数
            T entity = new T();

            List<SqlParameter> parameters = new List<SqlParameter>();
            parameters.Add(new SqlParameter("@where", strWhere));
            #endregion

            StringBuilder sqlStr = new StringBuilder();
            sqlStr.Append("select count(1) FROM ");
            sqlStr.Append(entity.GetType().Name);
            if (strWhere.Trim().Length > 0)
                sqlStr.Append(" where @where");

            return int.Parse(DatabaseAccess.SqlHelper.ExecuteScalarText(connection, sqlStr.ToString(), parameters.ToArray()).ToString());
        }

        /// <summary>
        /// 执行sql语句
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="cmdtype"></param>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public virtual int ExecteNonQuerySQL(string connection, CommandType cmdtype, string sql, params SqlParameter[] parameters)
        {
            return DatabaseAccess.SqlHelper.ExecteNonQuery(connection, cmdtype, sql, parameters);
        }

        /// <summary>
        /// 获取类主键
        /// </summary>
        /// <param name="connection">连接字符串</param>
        /// <param name="entity">类</param>
        /// <returns></returns>
        public virtual string GetPrimarykey(string connection, T entity)
        {
            StringBuilder sqlStr = new StringBuilder();
            sqlStr.Append("EXEC sp_pkeys @table_name='" + entity.GetType().Name + "'");

            SqlParameter[] parameters = new SqlParameter[]
            {
               
            };

            return DatabaseAccess.SqlHelper.ExecuteDataSetText(connection,sqlStr.ToString(),parameters).Tables[0].Rows[0]["COLUMN_NAME"].ToString();
        }

        /// <summary>
        /// 执行sql语句
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="cmdtype"></param>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public virtual DataSet ExecuteDataSetSQL(string connection, CommandType cmdtype, string sql, params SqlParameter[] parameters)
        {
            return DatabaseAccess.SqlHelper.ExecuteDataSet(connection, cmdtype, sql, parameters);
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值