之前老大说要改变代码中充斥着各种Select的Sql语句字符串的情况,让我尝试着做一个简单的SqlHelper,要具有以下功能: 1.不要在业务代码中暴露DataTable或者DataSet类型: 2.可以完成Select操作,需要支持条件查询,分页,单条记录查询,排序,连表,单个值: 3.可以完成添加单条记录,添加多条记录,修改记录和删除记录: 4.使用过程中要兼容老代码,既允许直接传入Sql: 5.要同时兼容MySql和Sql Server. 我之前写过很多Linq的代码,对那种函数式编程很…
此类是整个SqlHelper的另一个核心,基本思想就是通过EntityHelper,ObjectHelper和ExpressionHelper获取拼接Select语句的全部元素,拼接出完整Select语句. using System.Collections.Generic; using RA.DataAccess.Common; namespace RA.DataAccess { public partial class SqlSession<T> { public SqlSession()…
这个ExpressionHelper类,是整个SqlHelper中,最核心的一个类,主要功能就是将Lambda表达式转换为Sql语句.同时这个转换过程比较复杂,所以下面详细讲解一下思路和这个类的作用. 0x01基本 在Sql语句中,主要由表名,字段,条件语句等元素组成,而这些元素中,表名,字段可以由实体表示出来,条件语句可以由Lambda表达式表现出来. 在Sql语句中,条件语句可以说是Select中的核心,其中很多功能和Lambda中提供的方法很相似,比如: 实体:…
MySql的数据处理类和Sql Server没有太大差别,从思路上来说没有区别,所以此处只是给出代码,不再多加解释了. using System; using System.Configuration; using MySql.Data.MySqlClient; using RA.DataAccess.Common; namespace RA.DataAccess.MySqlDbUtility { public partial class DbUtility : IDbUtility { pri…
以下是整个SqlHelper的Demo: public Result<List<ArticleDTO>> GetIndexArticleList(int count, int userID) { var exp = DbUtilityFactory.GetDbUtility().GetSqlExpression<ArticleEntity>(); exp.Where(a => a.userID == userID); exp.OrderByDescending(a…
基本思想,将MsSqlDbUtility和MySqlDbUtility设计成单例模式,通过App.config或Web.config进行默认的数据库设置,然后通过DbUtilityFactory获取DbUtility. 1.接口: using System; using System.Collections.Generic; using System.Data; using System.Linq.Expressions; using RA.DataAccess.MsSqlDbUtility;…
ObjectHelper的主要功能有: 1.通过反射获取Entity的实例的字段值和表名,跳过自增键并填入Dictionary<string,string>中. namespace RA.DataAccess.Common { internal static class ObjectHelper { /// <summary> /// 获取Entity实例的字段名和值(用于更新和插入数据) /// </summary> /// <param name="…
这个类基本上就是调用EntityHelper,ExpressionHelper和ObjectHelper来进行各种完整SQL的拼接操作. using System; using System.Configuration; using System.Data.SqlClient; using RA.DataAccess.Common; namespace RA.DataAccess.MsSqlDbUtility { public partial class DbUtility : IDbUtili…
EntityHelper的主要功能有: 1.通过反射获取DTO的字段,主要提供给在需要从Entity获取数据后,填充给DTO并返回的作用: 通过反射获取PropertyInfo[]对象,然后取出Name属性,填入新表. /// <summary> /// 获取DTO字段 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns&g…
对于需求中的不要暴露DataTable或DataSet,我想到了设计中常用的对象:实体(Entity),通过实体将数据库中的字段封装成类,这样做不仅使代码更有可读性,维护起来也很方便.同时我自定义了一些C#特性来表述字段在数据库中的特性. 1.递增键: namespace RA.DataAccess.Attributes { /// <summary> /// 递增键 /// </summary> [AttributeUsage(AttributeTargets.Property,…