linq to sql 获取sql与参数添加到日志中
这里的linq to sql并未使用ef
主要有以下内容
1、新增
2、修改
3、删除
4、查询
1、新增,修改,删除获取sql语句通过DataContext.Log获取执行的sql语句
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
db.Log = sw;
db.SubmitChanges();
strSql = sb.ToString();
需要注意的是,通过Log获取sql语句的时候,只有在执行SubmitChanges后,才能拿到sql语句,并且拿到的语句也并不仅仅是只有操作语句,还有一个查询语句,如果不需要里面的查询,那么就需要自行处理下 2、新增,修改,删除获取参数如下:
ChangeSet cs = db.GetChangeSet();
string insertValue = cs.Inserts.Count > 0 ? Newtonsoft.Json.JsonConvert.SerializeObject(cs.Inserts[0]) : "";
通过ChangeSet 对象中的Inserts Updates Deletes 可以获取到新增,修改,删除的集合,ChangeSet 获取内容,在SubmitChanges()执行之前 3、当我们通过泛型去写的时候,我们可以通过 db.GetTable(typeof(T))类似的方式去执行linq,而不是使用db.Tables的方式,我们去看db.Tables的写法,实际就是返回db.GetTable(typeof(T))罢了,代码如下:
db.GetTable(typeof(T)).InsertOnSubmit(model); 4、查询的时候,获取sql有点区别,我们需要通过IQueryable来实现,通过IEnumerable是无法实现的,获取sql的代码如下:
IQueryable<T> q = db.GetTable<T>().Where(where); //获取sql语句
System.Data.Common.DbCommand dc = db.GetCommand(q);
string strSql = dc.CommandText;
参数的获取如下:
string paras = "{0}: {1},";
foreach (DbParameter p in dc.Parameters)
{
strSql += string.Format(paras, p.ParameterName, p.Value);
}
ParameterName是参数名称,Value是参数的值
其中where中的条件类型为:Expression<Func<T, bool>>,此条件为参数时,我们只需要如下就可以使用:
public IQueryable<T> GetQueryable(Expression<Func<T, bool>> where){
IQueryable<T> q = db.GetTable<T>().Where(where);
} public List<实体> GetModels(){
return GetQueryable(m => m.Id = 20).ToList();
}
完整增加,删除,修改,查询的代码如下,至于实体要如何定义,却需要自行把握,我这里面,基类泛型,继承时,传实体的方式
/// <summary>
/// 新增
/// </summary>
/// <param name="model"></param>
/// <param name="log"></param>
/// <returns></returns>
public int InsertModel(T model, string log)
{ try
{
string strSql = string.Empty; db.GetTable(typeof(T)).InsertOnSubmit(model); //字段与值得对应字符串
ChangeSet cs = db.GetChangeSet();
string insertValue = cs.Inserts.Count > 0 ? Newtonsoft.Json.JsonConvert.SerializeObject(cs.Inserts[0]) : ""; StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
db.Log = sw; db.SubmitChanges(); strSql = sb.ToString(); string strLog = string.Empty;
if (string.IsNullOrWhiteSpace(log))
{
strLog = "新增数据,SQL:" + strSql + ",字段值:" + insertValue;
}
else
{
strLog = log;
} InsertLog(LOGTYPE.新增.GetHashCode(), strLog); return model.Id;
}
catch (Exception ex)
{
this.WriteErrorLog(ex.Message);
throw ex;
} } /// <summary>
/// 更新
/// </summary>
/// <param name="log"></param>
private void Update(string log)
{
try
{
string strSql = string.Empty; //接收日志内容
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
db.Log = sw; //获取更改前后的值
ChangeSet cs = db.GetChangeSet(); string insertValue = cs.Inserts.Count > 0 ? Newtonsoft.Json.JsonConvert.SerializeObject(cs.Inserts[0]) : "";
string updateValue = cs.Updates.Count > 0 ? Newtonsoft.Json.JsonConvert.SerializeObject(cs.Updates[0]) : ""; db.SubmitChanges(); //获取sql语句,无法获取,官方说明是支持4.5以上的框架,并未使用4.5的框架测试
//通过 db.Log接收
strSql = sb.ToString();
string strLog = string.Empty;
if (string.IsNullOrWhiteSpace(log))
{
strLog = "修改数据,SQL:" + strSql + ",修改前字段值:" + insertValue + ",修改后的值:" + updateValue;
}
else
{
strLog = log;
} InsertLog(LOGTYPE.修改.GetHashCode(), strLog);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 修改
/// </summary>
/// <param name="log"></param>
/// <returns></returns>
public bool UpdateModel(string log)
{ try
{
Update(log);
return true;
}
catch (System.Data.Linq.ChangeConflictException ex)
{
foreach (System.Data.Linq.ObjectChangeConflict occ in db.ChangeConflicts)
{
//
occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
}
Update(log);
//db.SubmitChanges();
return true;
}
catch (Exception ex)
{
WriteErrorLog(ex.Message);
return false; } } /// <summary>
/// 删除内容
/// </summary>
/// <param name="where"></param>
/// <param name="log"></param>
/// <returns></returns>
public bool Delete(Expression<Func<T, bool>> where,string log)
{
try
{
string strSql = string.Empty; db.GetTable(typeof(T)).DeleteOnSubmit(where); //字段与值得对应字符串
ChangeSet cs = db.GetChangeSet();
string deleteValue = cs.Deletes.Count > 0 ? Newtonsoft.Json.JsonConvert.SerializeObject(cs.Deletes) : ""; StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
db.Log = sw; db.SubmitChanges(); strSql = sb.ToString(); string strLog = string.Empty;
if (string.IsNullOrWhiteSpace(log))
{
strLog = "删除数据,SQL:" + strSql + ",字段值:" + deleteValue;
}
else
{
strLog = log;
} InsertLog(LOGTYPE.删除.GetHashCode(), strLog); return !string.IsNullOrWhiteSpace(deleteValue);
}
catch (Exception ex)
{
this.WriteErrorLog(ex.Message);
throw ex;
}
} /// <summary>
/// 返回IQueryable,调用如:GetQueryable(where,log).ToList()或者GetQueryable(where,log).First()
/// </summary>
/// <param name="where"></param>
/// <param name="log"></param>
/// <returns></returns>
public IQueryable<T> GetQueryable(Expression<Func<T, bool>> where, string log = "")
{
try
{
IQueryable<T> q = db.GetTable<T>().Where(where); //获取sql语句
System.Data.Common.DbCommand dc = db.GetCommand(q);
string strSql = dc.CommandText; string strLog = string.Empty;
if (string.IsNullOrWhiteSpace(log))
{
string paras = "{0}: {1},";
strSql = "linq获取数据,SQL:" + strSql + ",参数:";
foreach (DbParameter p in dc.Parameters)
{
strSql += string.Format(paras, p.ParameterName, p.Value);
}
}
else
{
strLog = log;
} InsertLog(LOGTYPE.查询.GetHashCode(), strLog); return q;
}
catch (Exception ex)
{
WriteErrorLog(ex.Message);
throw new Exception("执行失败!失败原因:" + ex.Message);
}
}
linq to sql 获取sql与参数添加到日志中的更多相关文章
- sql获取的时间不能直接在c#中tostring成我们要的格式,要转化一下
DateTime.Parse(Model.Rows[0]["datevalidbegin"].ToString()).ToString("yyyy-MM-dd" ...
- Logback获取SkyWalking的全局唯一标识 trace-id 记录到日志中
为什么要获取trace-id 通过上文Docker-Compose搭建单体SkyWalking我们搭建了SkyWalking服务,我们需要在日志中记录下来每次请求的唯一标识(trace-id),这样就 ...
- 黑马程序员_ADO.Net(ExecuteReader,Sql注入与参数添加,DataSet,总结DataSet与SqlDataReader )
转自https://blog.csdn.net/u010796875/article/details/17386131 一.执行有多行结果集的用ExecuteReader SqlDateReader ...
- SQL获取所有数据库名、表名、储存过程以及参数列表
SQL获取所有数据库名.表名.储存过程以及参数列表 1.获取所有用户名:SELECT name FROM Sysusers where status='2' and islogin='1'islogi ...
- sql 解析字符串添加到临时表中 sql存储过程in 参数输入
sql 解析字符串添加到临时表中 sql存储过程in 参数输入 解决方法 把字符串解析 添加到 临时表中 SELECT * into #临时表 FROM dbo.Func_SplitOneCol ...
- IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
IT咨询顾问:一次吐血的项目救火 年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...
- Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全
该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅 ...
- SQL Server - 最佳实践 - 参数嗅探问题 转。
文章来自:https://yq.aliyun.com/articles/61767 先说我的问题,最近某个存储过程,暂定名字:sp_a 总是执行超时,sp_a带有一个参数,暂定名为 para1 var ...
- [LINQ2Dapper]最完整Dapper To Linq框架(五)---查看Linq实际执行的SQL
此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper支持.net framework4.6.1及 ...
随机推荐
- Keepalived & LVS: 实现web的负载均衡和高可用
目录 1. 环境介绍2. LVS DR模型中Realserver上的准备3. ha上的准备4. 配置keepalived5. 测试Realserver的切换6. failback页面测试7. keep ...
- 9.3.2 map端连接-CompositeInputFormat连接类
1.1.1 map端连接-CompositeInputFormat连接类 (1)使用CompositeInputFormat连接类需要满足三个条件: 1)两个数据集都是大的数据集,不能 ...
- 洛谷P1157----组合数的输出
#include<stdio.h> ] = { ,,,,,,,,,,,,,,,,,,, }; ]; int n, r; ; void dfs(int x) {//x表示当前是第几个数 in ...
- Linux运维---磁盘存储-2. RAID
随着单块磁盘在数据安全.性能.容量上呈现出的局限,磁盘阵列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出现了,RAID把多块独立的磁 ...
- jenkins 参数化运行性能测试脚本
概述 我们用jenkins做持续集成的时候,常常需要跑不同的脚本,传不同的参数.尤其是性能基准测试,线程数和持续时间需要实时调整以满足我们的测试需求.那么是不是需求变了,我们 就需要重新准备一套脚本? ...
- PHPExcel使用
参考链接: 官方github:https://github.com/PHPOffice/PHPExcel 设置表格字体颜色等操作:http://www.cnblogs.com/grimm/p/9 ...
- SpringBoot安全管理--(二)基于数据库的认证
简介: 上篇文章向读者介绍的认证数据都是定义在内存中的,在真实项目中,用户的基本信息以及角色等都存储在数据库中,因此需要从数据库中获取数据进行认证. 开始: 首先建表并且插入数据: pom.xml & ...
- C#设计模式学习笔记:(7)桥接模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7699301.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第二个模式--桥 ...
- MySQL安装详细步骤(附迅雷下载链接)
环境:windows10.64bit.mysql 8.0.19 迅雷下载链接8.0版本 https://cdn.mysql.com//Downloads/MySQLInstaller/mysql-in ...
- windows10禁止更新
1. WIN10 禁止自动更新 转载于https://jingyan.baidu.com/article/1e5468f94dc9a3484961b7a8.html 方法一:(注册表方式关闭) 在co ...