让C#开发更简单抽象增删改.docx

上传人:b****5 文档编号:8439181 上传时间:2023-01-31 格式:DOCX 页数:21 大小:34.37KB
下载 相关 举报
让C#开发更简单抽象增删改.docx_第1页
第1页 / 共21页
让C#开发更简单抽象增删改.docx_第2页
第2页 / 共21页
让C#开发更简单抽象增删改.docx_第3页
第3页 / 共21页
让C#开发更简单抽象增删改.docx_第4页
第4页 / 共21页
让C#开发更简单抽象增删改.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

让C#开发更简单抽象增删改.docx

《让C#开发更简单抽象增删改.docx》由会员分享,可在线阅读,更多相关《让C#开发更简单抽象增删改.docx(21页珍藏版)》请在冰豆网上搜索。

让C#开发更简单抽象增删改.docx

让C#开发更简单抽象增删改

让C#开发更简单,抽象增删改

相信经常做一些MS,CRM项目的童鞋非常有体会,大部分时间都是在复制和粘贴,大部分项目框架都是建一个三层,首先是DAL建一些增删改查,然后呢是BLL业务层再建一些增删改查,然后UI层再调用增删改查,整个过程非常的繁琐,开发效率并不是很高,这种项目做久了之后,就非常的痛苦,非常的无聊。

今天我给大家带来一个抽象出增删改查的框架,相信有些大牛早就总结出来了,不喜勿喷哈,本人旨在分享。

你再也不用写增删改查了,我给你抽象出来了!

现在业界火了一种ORM框架,那就是Dapper,我也是Dapper的粉丝之一,而我总结出来的框架也是基于Daaper。

下面是我的代码,首先是DapperHelper类,数据库通用访问类(用Nuget工具先把Dapper类引用到NetUtility.Dapper.Core项目中去):

NetUtility.Dapper.Core.DataBaseAccess.cs

using System; 

using System.Collections.Generic; 

using System.Configuration; 

using System.Data.SqlClient; 

using System.Linq; 

using System.Text; 

using System.Threading.Tasks; 

using Dapper; 

using System.Data; 

using NetUtility.Entity; 

using System.Reflection; 

 

namespace NetUtility.Dapper.Core 

    /// 

 

    /// 数据库访问类 

    /// 

 

    public class DataBaseAccess 

    { 

        public static SqlConnection CreateConnection() 

        { 

            string connStr = ConfigurationManager.ConnectionStrings["connString"].ConnectionString; 

            SqlConnection conn = new SqlConnection(connStr); 

            conn.Open(); 

            return conn; 

        } 

 

        /// 

 

        /// 执行增、删、改方法 

        /// 

 

        ///  

        ///  

        ///  

        public static int Execute(string sql, object parms = null) 

        { 

            using (IDbConnection conn = CreateConnection()) 

            { 

                return conn.Execute(sql,parms); 

            } 

        } 

 

        /// 

 

        /// 得到单行单列 

        /// 

 

        ///  

        ///  

        ///  

        public static object ExecuteScalar(string sql, object parms = null) 

        { 

            using (IDbConnection conn = CreateConnection()) 

            { 

                return conn.ExecuteScalar(sql, parms); 

            } 

        } 

 

        /// 

 

        /// 单个数据集查询 

        /// 

 

        ///  

        ///  

        ///  

        public static List Query(string sql,Func pre ,object parms = null) 

        { 

            using (IDbConnection conn = CreateConnection()) 

            { 

                return conn.Query(sql, parms).Where(pre).ToList(); 

            } 

        } 

 

        /// 

 

        /// 单个数据集查询 

        /// 

 

        ///  

        ///  

        ///  

        public static List Query(string sql, object parms = null) 

        { 

            using (IDbConnection conn = CreateConnection()) 

            { 

                return conn.Query(sql, parms).ToList(); 

            } 

        }    

 

        /// 

 

        /// 多个数据集查询 

        /// 

 

        ///  

        ///  

        ///  

        public static SqlMapper.GridReader MultyQuery(string sql, object parms = null) 

        { 

            using (IDbConnection conn = CreateConnection()) 

            { 

                return  conn.QueryMultiple(sql, parms); 

            } 

        } 

 

        /// 

 

        /// 单个数据集查询 

        /// 

 

        ///  

        ///  

        ///  

        public static TEntity FirstOrDefault(string sql,Func selector, object parms = null) 

        { 

            using (IDbConnection conn = CreateConnection()) 

            { 

                return conn.Query(sql, parms).Where(selector).FirstOrDefault(); 

            } 

        } 

    } 

}

我把增删改查抽象出来了,少不了的就是SQL语句的生成,生成SQL语句,要么是映射,要么是反射,而我用的是反射,给一个Entity类,我读取他所有属性和字段,然后生成对应的SQL语句。

NetUtility.Dapper.Core.DataMapping.cs

 

using System; 

using System.Collections.Generic; 

using System.Configuration; 

using System.Linq; 

using System.Reflection; 

using System.Text; 

using System.Threading.Tasks; 

 

namespace NetUtility.Dapper.Core 

    internal class DataMapping where TModel :

 class 

    { 

        #region 数据库类型+DataBaseType 

        /// 

 

        /// 数据库类型 

        /// 

 

        public static string DataBaseType 

        { 

            get 

            { 

                string strType = ConfigurationManager.AppSettings["DataBaseType"]; 

                if (!

string.IsNullOrEmpty(strType)) 

                { 

                    return strType; 

                } 

                else 

                { 

                    return string.Empty; 

                } 

            } 

        }  

        #endregion 

 

        #region 主键属性字段+PrimaryKey 

        /// 

 

        /// 主键字段名称 

        /// 

 

        public static string PrimaryKey 

        { 

            get 

            { 

                Type t = typeof(TModel); 

                TableInfoAttribute tableInfo = t.GetCustomAttribute(typeof(TableInfoAttribute), true) as TableInfoAttribute;    

                if (tableInfo!

=null)//如果没有标识表信息特性,则通过表名向数据库中得到主键信息 

                { 

                    return tableInfo.PrimaryKey;               

                } 

                else 

                { 

                    string tableName = TableName(); 

                    return DataBaseAccess.ExecuteScalar("SELECT name FROM SysColumns WHERE id=Object_Id('" + tableName + "') and colid=(select top 1 colid from sysindexkeys where id=Object_Id('" + tableName + "'))").ToString(); 

                } 

            } 

        }  

        #endregion 

 

        #region 获取表名+TableName 

        /// 

 

        /// 获取表名 

        /// 

 

        /// 数据库表名前缀 

        ///  

        public static string TableName(string prev = "") 

        { 

            Type t = typeof(TModel); 

            TableInfoAttribute tableInfo = t.GetCustomAttribute(typeof(TableInfoAttribute), true) as TableInfoAttribute; 

            return tableInfo !

= null ?

 tableInfo.TableName :

 string.Concat(prev, t.Name); 

        }  

        #endregion 

 

        #region Select 查询语句+GetQuerySql 

        /// 

 

        /// Select 查询语句 

        /// 

 

        ///  

        public static string GetQuerySql() 

        { 

            StringBuilder sql = new StringBuilder("select * from "); 

            sql.Append(TableName()); 

 

            return sql.ToString(); 

        }  

        #endregion 

 

        #region Insert非Null属性的对象实例 Sql 语句+GetInsertSql 

        /// 

 

        /// Insert 非Null属性的对象实例 Sql 语句 

        /// 

 

        ///  

        ///  

        public static string GetInsertSql(TModel model) 

        { 

            StringBuilder sql = new StringBuilder("insert into "); 

 

            string[] props = Propertys(model); 

            sql.Append(TableName()); 

            sql.Append("("); 

            sql.Append(string.Join(",", props)); 

            sql.Append(") values(@"); 

            sql.Append(string.Join(",@", props)); 

            sql.Append(");select @@IDENTITY"); 

 

            return sql.ToString(); 

        }  

        #endregion 

 

        #region Delete Sql 语句+GetDeleteSql 

        /// 

 

        /// Delete Sql 语句 

        /// 

 

        ///  

        public static string GetDeleteSql() 

        { 

            return string.Format(@"delete from {0} where {1} in @IdList", TableName(), PrimaryKey); 

        }  

        #endregion 

 

        #region Update 非Null属性的对象实例 Sql语句+GetUpdateSql 

        /// 

 

        /// Update 非Null属性的对象实例 Sql语句 

        /// 

 

        ///  

        ///  

        public static string GetUpdateSql(TModel model) 

        { 

            StringBuilder sql = new StringBuilder("update "); 

            string[] props = Propertys(model); 

            sql.Append(TableName()); 

            sql.Append(" set "); 

            foreach (string propName in props) 

            { 

                sql.Append(propName + "=@" + propName + ","); 

            } 

            sql.Remove(sql.Length - 1, 1); 

            sql.Append(" where " + PrimaryKey + "=@Id"); 

            return sql.ToString(); 

        }  

        #endregion 

 

        #region 非主键且非Null属性集合+Propertys 

        /// 

 

        /// 非主键且非Null属性 

        /// 

 

        ///  

        ///  

        public static string[] Propertys(TModel model) 

        { 

            PropertyInfo[] props = typeof(TModel).GetProperties(); 

            List list = new List(); 

            string key = PrimaryKey; 

            if (props !

= null && props.Length > 0) 

            { 

                foreach (PropertyInfo prop in props) 

                { 

                    if (prop.GetValue(model, null) !

= null && !

prop.Name.Equals(key, StringComparison.OrdinalIgnoreCase)) 

                    { 

                        list.Add(prop.Name); 

                    } 

                } 

            } 

 

            return list.ToArray(); 

        }  

        #endregion 

    } 

 

代码中的TableInfoAttribute类是我建一个属性特性类,用于标识表名和主键名称的特性类,假如Entity实体类上面没有标识主键名称,框架默认会用Entity类名作为表名,建议最好标识一下表名和主键名称。

NetUtility.Dapper.Core.TableInfoAttribute.cs

using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Text; 

using System.Threading.Tasks; 

 

namespace NetUtility.Da

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1