这里的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与参数添加到日志中的更多相关文章

  1. sql获取的时间不能直接在c#中tostring成我们要的格式,要转化一下

    DateTime.Parse(Model.Rows[0]["datevalidbegin"].ToString()).ToString("yyyy-MM-dd" ...

  2. Logback获取SkyWalking的全局唯一标识 trace-id 记录到日志中

    为什么要获取trace-id 通过上文Docker-Compose搭建单体SkyWalking我们搭建了SkyWalking服务,我们需要在日志中记录下来每次请求的唯一标识(trace-id),这样就 ...

  3. 黑马程序员_ADO.Net(ExecuteReader,Sql注入与参数添加,DataSet,总结DataSet与SqlDataReader )

    转自https://blog.csdn.net/u010796875/article/details/17386131 一.执行有多行结果集的用ExecuteReader SqlDateReader  ...

  4. SQL获取所有数据库名、表名、储存过程以及参数列表

    SQL获取所有数据库名.表名.储存过程以及参数列表 1.获取所有用户名:SELECT name FROM Sysusers where status='2' and islogin='1'islogi ...

  5. sql 解析字符串添加到临时表中 sql存储过程in 参数输入

    sql 解析字符串添加到临时表中  sql存储过程in 参数输入 解决方法 把字符串解析 添加到 临时表中 SELECT * into #临时表   FROM dbo.Func_SplitOneCol ...

  6. IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题

    IT咨询顾问:一次吐血的项目救火   年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...

  7. Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全

    该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅 ...

  8. SQL Server - 最佳实践 - 参数嗅探问题 转。

    文章来自:https://yq.aliyun.com/articles/61767 先说我的问题,最近某个存储过程,暂定名字:sp_a 总是执行超时,sp_a带有一个参数,暂定名为 para1 var ...

  9. [LINQ2Dapper]最完整Dapper To Linq框架(五)---查看Linq实际执行的SQL

    此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper支持.net framework4.6.1及 ...

随机推荐

  1. Keepalived & LVS: 实现web的负载均衡和高可用

    目录 1. 环境介绍2. LVS DR模型中Realserver上的准备3. ha上的准备4. 配置keepalived5. 测试Realserver的切换6. failback页面测试7. keep ...

  2. 9.3.2 map端连接-CompositeInputFormat连接类

    1.1.1         map端连接-CompositeInputFormat连接类 (1)使用CompositeInputFormat连接类需要满足三个条件: 1)两个数据集都是大的数据集,不能 ...

  3. 洛谷P1157----组合数的输出

    #include<stdio.h> ] = { ,,,,,,,,,,,,,,,,,,, }; ]; int n, r; ; void dfs(int x) {//x表示当前是第几个数 in ...

  4. Linux运维---磁盘存储-2. RAID

    随着单块磁盘在数据安全.性能.容量上呈现出的局限,磁盘阵列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出现了,RAID把多块独立的磁 ...

  5. jenkins 参数化运行性能测试脚本

    概述 我们用jenkins做持续集成的时候,常常需要跑不同的脚本,传不同的参数.尤其是性能基准测试,线程数和持续时间需要实时调整以满足我们的测试需求.那么是不是需求变了,我们 就需要重新准备一套脚本? ...

  6. PHPExcel使用

       参考链接: 官方github:https://github.com/PHPOffice/PHPExcel 设置表格字体颜色等操作:http://www.cnblogs.com/grimm/p/9 ...

  7. SpringBoot安全管理--(二)基于数据库的认证

    简介: 上篇文章向读者介绍的认证数据都是定义在内存中的,在真实项目中,用户的基本信息以及角色等都存储在数据库中,因此需要从数据库中获取数据进行认证. 开始: 首先建表并且插入数据: pom.xml & ...

  8. C#设计模式学习笔记:(7)桥接模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7699301.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第二个模式--桥 ...

  9. MySQL安装详细步骤(附迅雷下载链接)

    环境:windows10.64bit.mysql 8.0.19 迅雷下载链接8.0版本 https://cdn.mysql.com//Downloads/MySQLInstaller/mysql-in ...

  10. windows10禁止更新

    1. WIN10 禁止自动更新 转载于https://jingyan.baidu.com/article/1e5468f94dc9a3484961b7a8.html 方法一:(注册表方式关闭) 在co ...