这个类基本上就是调用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 : IDbUtility
{
private SqlConnection conn;
private SqlDataAdapter da;
private string connectionString; private DbUtility()
{
connectionString = ConfigurationManager.AppSettings["MsSql"];
}
private static DbUtility _dbUtility; public static DbUtility GetInstance()
{
return _dbUtility ?? (_dbUtility = new DbUtility());
} /// <summary>
/// 获得SQLSession实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public SqlSession<T> GetSqlExpression<T>() where T : class
{
var temp = new SqlSession<T>();
conn = new SqlConnection(connectionString);
return temp;
}
}
}
 using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Linq.Expressions;
using RA.DataAccess.Common; namespace RA.DataAccess.MsSqlDbUtility
{
public partial class DbUtility
{
/// <summary>
/// 获取列表,适用于单表查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="exp"></param>
/// <returns></returns>
public List<T> GetList<T>(SqlSession<T> exp) where T : class
{
var datatable = GetDataBySql<T>(exp.SqlExpression);
var result = new List<T>();
foreach (DataRow i in datatable.Rows)
{
T obj = Activator.CreateInstance<T>();
foreach (var k in exp.Fields)
{
SetValue(ref obj, i[k], k);
}
result.Add(obj);
}
return result;
} /// <summary>
/// 获取列表,适用于联表查询
/// </summary>
/// <typeparam name="Target">DTO类型</typeparam>
/// <typeparam name="T">exp代表的Entity类型</typeparam>
/// <param name="exp">ISqlSession实例</param>
/// <returns>DTO列表</returns>
public List<Target> GetList<Target, T>(SqlSession<T> exp) where T : class where Target : class
{
var datatable = GetDataBySql<T>(exp.SqlExpression);
var result = new List<Target>(); foreach (DataRow i in datatable.Rows)
{
var obj = Activator.CreateInstance<Target>();
foreach (var k in EntityHelper.GetDTOFields<Target>())
{
SetValue(ref obj, i[k], k);
}
result.Add(obj);
}
return result;
} public List<T> Paged<T>(Expression<Func<T, object>> By, int pageIndex, int pageSize = ) where T : class
{
var result = new List<T>();
var sql = $@"SELECT * FROM {EntityHelper.GetTableName<T>()} ORDER BY {ExpressionHelper.GetSqlByExpression(By.Body)} OFFSET {(pageIndex - 1) * pageSize} ROW FETCH NEXT {pageSize} ROW ONLY";
conn = new SqlConnection(connectionString);
conn.Open();
var datatable = GetDataBySql<T>(sql);
conn.Close();
foreach (DataRow i in datatable.Rows)
{
var obj = Activator.CreateInstance<T>();
foreach (var k in EntityHelper.GetFields<T>(false))
{
SetValue(ref obj, i[k], k);
}
result.Add(obj);
}
return result;
}
/// <summary>
/// 按照主键获取单条记录
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="func">筛选条件</param>
/// <returns>实体的实例</returns>
public T GetSingle<T>(Expression<Func<T, bool>> func) where T : class
{
var temptable = new DataTable();
var exp = ExpressionHelper.GetSqlByExpression(func.Body);
var fields = EntityHelper.GetFiledString<T>();
var tablename = EntityHelper.GetTableName<T>();
var sql = "SELECT " + fields + " FROM " + tablename + " WHERE " + exp;
conn = new SqlConnection(connectionString);
da = new SqlDataAdapter(sql, conn);
da.Fill(temptable);
if(temptable.Rows.Count == )
{
return null;
}
T obj = Activator.CreateInstance<T>();
foreach (var k in EntityHelper.GetFields<T>(false))
{
SetValue(ref obj, temptable.Rows[][k], k);
}
return obj;
} /// <summary>
/// 删除单个记录
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func"></param>
public int Delete<T>(Expression<Func<T, bool>> func) where T : class
{
var tablename = EntityHelper.GetTableName<T>();
var exp = ExpressionHelper.GetSqlByExpression(func.Body);
var sql = "DELETE FROM " + tablename + " WHERE " + exp;
return RunSingleSql<T>(sql);
} /// <summary>
/// 添加单个记录
/// </summary>
/// <param name="obj"></param>
public int Add<T>(T obj) where T : class
{
var data = ObjectHelper.GetKeyValue(obj); var sql = "INSERT INTO {0}({1}) VALUES({2})";
var tablename = EntityHelper.GetTableName<T>();
var keys = string.Join(",", data.Keys.ToArray());
var values = string.Join(",", data.Values.Select(a => a == null ? "''" : "'" + a.ToString() + "'")); sql = string.Format(sql, tablename, keys, values); return RunSingleSql<T>(sql);
} /// <summary>
/// 执行除了Select以外的SQL,请不要在循环中使用这个方法,会有性能问题
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <returns></returns>
public int RunSingleSql<T>(string sql) where T : class
{
var conn = new SqlConnection(connectionString);
var dc = new SqlCommand(sql, conn); if (conn.State != ConnectionState.Open)
{
conn.Open();
}
try
{
return dc.ExecuteNonQuery();
}
finally
{
conn.Close();
}
} /// <summary>
/// 通过sql获取数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <returns></returns>
public DataTable GetDataBySql<T>(string sql) where T : class
{
var conn = new SqlConnection(connectionString);
da = new SqlDataAdapter(sql, conn);
var result = new DataTable();
da.Fill(result);
return result;
} /// <summary>
/// 更新一条记录
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj">要修改的数据的Entity的实例</param>
/// <param name="func">要修改数据的条件</param>
/// <returns></returns>
public int Update<T>(T obj, Expression<Func<T, bool>> func) where T : class
{
if (func == null)
{
throw new ArgumentNullException("表达式不能为空!");
}
var tablename = EntityHelper.GetTableName<T>();
var data = ObjectHelper.GetKeyValue(obj);
var updatestr = data.Aggregate("", (current, i) => current + (i.Key + "='" + i.Value.ToString() + "',"));
updatestr = updatestr.Substring(, updatestr.Length - );
var where = ExpressionHelper.GetSqlByExpression(func.Body);
var sql = $"UPDATE {tablename} SET {updatestr} WHERE {@where}";
return RunSingleSql<T>(sql);
} /// <summary>
/// 批量添加记录
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
public int AddList<T>(List<T> objs) where T : class
{
if (!objs.Any())
{
throw new ArgumentNullException("列表为空!");
}
var tablename = EntityHelper.GetTableName(objs[].GetType());
var conn = new SqlConnection(connectionString);
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
var transaction = conn.BeginTransaction();
var dc = conn.CreateCommand();
dc.Transaction = transaction;
var count = ;
try
{
foreach (var k in objs)
{
var data = new Dictionary<string, object>();
foreach (var i in k.GetType().GetProperties())
{
var value = k.GetType().GetProperty(i.Name).GetValue(k, null);
data.Add(i.Name, value);
}
var keys = string.Join(",", data.Keys.ToArray());
var values = string.Join(",", data.Values.Select(a => "'" + a.ToString() + "'"));
var sql = $"INSERT INTO {tablename}({keys}) VALUES({values})";
dc.CommandText = sql;
dc.ExecuteNonQuery();
count++;
}
transaction.Commit();
return count;
}
catch (Exception ex)
{
transaction.Rollback();
throw ex;
}
finally
{
conn.Close();
}
} /// <summary>
/// 获取总数
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func">不传值的话,返回总数</param>
/// <returns></returns>
public int Count<T>(Expression<Func<T, bool>> func = null) where T : class
{
var tablename = EntityHelper.GetTableName<T>();
var sql = "";
if (func == null)
{
sql = $"SELECT COUNT(*) FROM {tablename}";
}
else
{
var where = ExpressionHelper.GetSqlByExpression(func.Body);
sql = $"SELECT COUNT(*) FROM {tablename} WHERE {@where}";
}
conn = new SqlConnection(connectionString);
da = new SqlDataAdapter(sql, conn);
var datatable = new DataTable();
da.Fill(datatable);
var result = (int)datatable.Rows[][];
return result;
} /// <summary>
/// 获取单个值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="Target"></typeparam>
/// <param name="field">字段名</param>
/// <param name="func">条件表达式</param>
/// <returns></returns>
public Target Scala<T,Target>(Expression<Func<T, Target>> field,Expression<Func<T,bool>> func)
{
var fieldname = ExpressionHelper.GetSqlByExpression(field.Body);
var exp = ExpressionHelper.GetSqlByExpression(func.Body);
var sql = $"SELECT {fieldname} FROM {EntityHelper.GetTableName<T>()} WHERE {exp}";
conn = new SqlConnection(connectionString);
da = new SqlDataAdapter(sql, conn);
var datatable = new DataTable();
da.Fill(datatable);
if(datatable.Rows.Count == )
{
return default(Target);
}
var result = (Target)datatable.Rows[][];
return result;
}
}
}

SqlHelper简单实现(通过Expression和反射)8.Sql Server数据处理类的更多相关文章

  1. SqlHelper简单实现(通过Expression和反射)7.MySql数据处理类

    MySql的数据处理类和Sql Server没有太大差别,从思路上来说没有区别,所以此处只是给出代码,不再多加解释了. using System; using System.Configuration ...

  2. QSqlDatabase的进一步封装(多线程支持+更加简单的操作)——同时支持MySQL, SQL Server和Sqlite

    开发背景: 1.直接用QSqlDatabase我觉得太麻烦了: 2.对于某些数据库,多个线程同时使用一个QSqlDatabase的时候会崩溃: 3.这段时间没什么干货放出来觉得浑身不舒服,就想写一个. ...

  3. SQL Server数据库连接类SQLHelper.cs

    using System; using System.Collections.Generic; using System.Text; using System.Configuration; using ...

  4. SqlHelper简单实现(通过Expression和反射)1.引言

    之前老大说要改变代码中充斥着各种Select的Sql语句字符串的情况,让我尝试着做一个简单的SqlHelper,要具有以下功能: 1.不要在业务代码中暴露DataTable或者DataSet类型: 2 ...

  5. SqlHelper简单实现(通过Expression和反射)6.Providor模式(工厂+策略)可配置数据库选择

    基本思想,将MsSqlDbUtility和MySqlDbUtility设计成单例模式,通过App.config或Web.config进行默认的数据库设置,然后通过DbUtilityFactory获取D ...

  6. C# Expression 树转化为SQL语句(一)

    sql有有四中基本语句,分别是增删改查,在建立model后如何生成这四中sql语句,降低开发时间. 我们先模拟出一张学生表: public class Student { public int id ...

  7. TransactionScope事务处理方法介绍及.NET Core中的注意事项 SQL Server数据库漏洞评估了解一下 预热ASP.NET MVC 的VIEW [AUTOMAPPER]反射自动注册AUTOMAPPER PROFILE

    TransactionScope事务处理方法介绍及.NET Core中的注意事项   作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.ht ...

  8. Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform

    Expression构建DataTable to Entity 映射委托   1 namespace Echofool.Utility.Common { 2 using System; 3 using ...

  9. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

随机推荐

  1. 第二百一十一节,jQuery EasyUI,ValidateBox(验证框)组件

    jQuery EasyUI,ValidateBox(验证框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 4.自定义验证 本节课重点了解 EasyUI 中 ValidateBox(验证框 ...

  2. ubuntu 用命令行设置chrome的proxy

    google-chrome-stable --proxy-server="IP proxy Server:port"

  3. cinder服务端的keystone认证机制

    keystone在openstack中的地位 Keystone作为OpenStack中的身份管理与授权模块,主要实现系统用户的身份认证.基于角色的授权管理.其他OpenStack服务的地址发现和安全策 ...

  4. util.inherits

    util.inherits util.inherits(constructor, superConstructor)是一个实现对象间原型继承 的函数. JavaScript 的面向对象特性是基于原型的 ...

  5. iOS开发之 -- oc和swift下输出乘法口诀表

    闲来无事,写着玩: oc: //乘法口诀表输出 ; i<=; i++) { ; j<=i; j++) { NSLog(@"%dx%d=%d\n",i,j,i*j); } ...

  6. 58、常规控件(1)Floating Action Button-浮动的圆形按钮

               <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...

  7. [MySQL] 变量(参数)的查看和设置 [转]

    [MySQL] 变量(参数)的查看和设置 类似于Oracle的参数文件,MySQL的选项文件(如my.cnf)用于配置MySQL服务器,但和Oracle叫法不一样,在MySQL里, 官方叫变量(Var ...

  8. C/C++求职宝典重点笔记

    这是我之前准备找工作时看<C/C++求职宝典>一书做的笔记,都是一些笔试面试中常考的重点难点问题,但比较基础,适合初学者看. 1. char c = '\72'; 中的\72代表一个字符, ...

  9. iOS xcode6.0使用7.1运行程序 iphone5上下有黑条

    转自:http://stackoverflow.com/questions/25817562/black-bars-appear-in-app-when-targeting-ios7-1-or-7-0 ...

  10. textarea输入字符有限制

    function limitedNumberOfInputCharacters(limitedNumber, string){ var strLength = 0; if(string !== nul ...