SqlHelper简单实现(通过Expression和反射)8.Sql Server数据处理类
这个类基本上就是调用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数据处理类的更多相关文章
- SqlHelper简单实现(通过Expression和反射)7.MySql数据处理类
MySql的数据处理类和Sql Server没有太大差别,从思路上来说没有区别,所以此处只是给出代码,不再多加解释了. using System; using System.Configuration ...
- QSqlDatabase的进一步封装(多线程支持+更加简单的操作)——同时支持MySQL, SQL Server和Sqlite
开发背景: 1.直接用QSqlDatabase我觉得太麻烦了: 2.对于某些数据库,多个线程同时使用一个QSqlDatabase的时候会崩溃: 3.这段时间没什么干货放出来觉得浑身不舒服,就想写一个. ...
- SQL Server数据库连接类SQLHelper.cs
using System; using System.Collections.Generic; using System.Text; using System.Configuration; using ...
- SqlHelper简单实现(通过Expression和反射)1.引言
之前老大说要改变代码中充斥着各种Select的Sql语句字符串的情况,让我尝试着做一个简单的SqlHelper,要具有以下功能: 1.不要在业务代码中暴露DataTable或者DataSet类型: 2 ...
- SqlHelper简单实现(通过Expression和反射)6.Providor模式(工厂+策略)可配置数据库选择
基本思想,将MsSqlDbUtility和MySqlDbUtility设计成单例模式,通过App.config或Web.config进行默认的数据库设置,然后通过DbUtilityFactory获取D ...
- C# Expression 树转化为SQL语句(一)
sql有有四中基本语句,分别是增删改查,在建立model后如何生成这四中sql语句,降低开发时间. 我们先模拟出一张学生表: public class Student { public int id ...
- TransactionScope事务处理方法介绍及.NET Core中的注意事项 SQL Server数据库漏洞评估了解一下 预热ASP.NET MVC 的VIEW [AUTOMAPPER]反射自动注册AUTOMAPPER PROFILE
TransactionScope事务处理方法介绍及.NET Core中的注意事项 作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.ht ...
- 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 ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
随机推荐
- 日期类Date
Java在日期类中封装了有关日期和时间的信息,用户可以通过调用相应的方法来获取系统时间或设置日期和时间.Date类中有很多方法在JDK1.0公布后已经过时了,在8.3中我们将介绍JDK1.0中新加的用 ...
- .NET开发笔记--对config文件的操作(3)
1.添加新节点前进行判断看是否已存在相同的属性值,若存在进行更新,不存在则进行添加操作. protected bool AddPizza() { //初始化id int newId; string f ...
- 嵌入式开发之davinci--- MSB和LSB
简介: MSB是Most Significant Bit的缩写,最高有效位.在二进制数中,MSB是最高加权位.与十进制数字中最左边的一位类似.通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右 ...
- 【BZOJ】2017: [Usaco2009 Nov]硬币游戏(dp+神题+博弈论)
http://www.lydsy.com/JudgeOnline/problem.php?id=2017 这题太神了,我想了一个中午啊 原来是看错题一直没理解题解说的,一直以为题解是错的QAQ “开始 ...
- Wise 打包细节
细节 说明 添加卸载快捷方式 缺省的安装程序快捷方式中没有卸载项:只能通过控制面板删除,或者主程序目录下的UnWise.exe来卸载.实际上,该文件就可以作为卸载程序. 可以复制一个快捷方式,将程序名 ...
- java强软弱虚引用详解(转载)
转载自:http://zhangjunhd.blog.51cto.com/113473/53092/ ava:对象的强.软.弱和虚引用 2007-12-01 17:20:20 标签:Java 软引用 ...
- NLM算法
non-Local Means 非局部均值 论文原文:http://www.ipol.im/pub/art/2011/bcm_nlm/?utm_source=doi 论文源代码:http://www. ...
- poj 1185(状压dp)
题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...
- jacob操作 office 内部对应代码
Excel操作 转换 xlAddIn 18 Microsoft Office Excel 加载项 xlAddIn8 ...
- 【BZOJ3876】[Ahoi2014]支线剧情 有上下界费用流
[BZOJ3876][Ahoi2014]支线剧情 Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩 ...