写出易调试的SQL(修订版)
1.前言
上篇 写出易调试的SQL , 带来了一些讨论, 暴露了不能重用执行计划和sql注入问题, 十分感谢园友们的建议 .
经过调整后 ,将原来的SQLHelper 抓SQL 用做调试环境用, 发布环境还是走Dapper的参数化查询, 保持原有优势.
见如下代码.
2. 在开发调试阶段 抓最终SQL
将Dapper 查询Query 和执行Execute 进行了再包装, 插入了 抓最终sql 的代码
public class DapperTaller
{ /// <summary>
/// dapper 执行查询 sql
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
public static IEnumerable<T> Query<T>(string sql, object param)
{
IEnumerable<T> result = null;
using (var con = DBHelper.GetConnection())
{
result = con.Query<T>(sql, param);
} //开发环境代码
if (GlobalVariable.env.IsDevelopment()) //IsDevelopment 方法为Asp.NET Core 自带的 是否为开发环境的判断方法
{
//最终SQL
var debugSql = GetDebugSQL(sql, param);
Debug.WriteLine(debugSql);
} return result;
} /// <summary>
/// dapper 执行 增加, 删除 ,修改 sql
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
public static int Execute(string sql, object param)
{
int result;
using (var con = DBHelper.GetConnection())
{
result = con.Execute(sql, param);
} //开发环境代码
if (GlobalVariable.env.IsDevelopment()) //IsDevelopment 方法为Asp.NET Core 自带的 是否为开发环境的判断方法
{
//最终SQL
var debugSql = GetDebugSQL(sql, param);
Debug.WriteLine(debugSql);
} //生产环境代码
if (GlobalVariable.env.IsProduction())
{
//根据需要将最终SQL 记录到日志 } return result;
} public static string GetDebugSQL(string sql, object param)
{
var sqlHelper = new SqlHelper();
foreach (var item in param.GetType().GetProperties())
{
var name = item.Name;
var value = item.GetValue(param);
sqlHelper.Param.Add(name, value);
} sqlHelper.ReplaceParam(ref sql);
return sql;
} } public class DBHelper
{
public static IDbConnection GetConnection()
{
return SQLServerHelper.GetConnection();
}
}
调用代码:
public IEnumerable<Ptype> GetPtypeDetail()
{
var sql = @"
SELECT
*
FROM dbo.CoacherStudentMoney a
INNER JOIN dbo.BaseData b ON a.CourseTypeId=b.Id
WHERE
StudentUserId=@StudentUserId AND Amount=@Amount
AND IsPay=@IsPay AND CreateDate=@CreateDate ";
var param = new
{
StudentUserId = "",
CreateDate = DateTime.Now,
Amount = ,
IsPay = true
}; IEnumerable<Ptype> plist = new List<Ptype>();
plist = DapperTaller.Query<Ptype>(sql, param); return plist;
}
最上面代码的此处为最终SQL 抓取
//开发环境代码
if (GlobalVariable.env.IsDevelopment())
{
//最终SQL
var debugSql = GetDebugSQL(sql, param);
Debug.WriteLine(debugSql);
}
并且会在VS 的输出窗口输出

进一步方便了调试.
3.最后
现在最终SQL 的抓取发生在 调试开发阶段 .
发布代码后, 将不会进行最终SQL的抓取. 并且走的还是Dapper 原有参数化查询的方式, 依旧拥有执行计划重用, 防SQL注入的优势.
注:
完整可执行代码见: https://pan.baidu.com/s/1jI4YcQi
本文代码是 AnuoApc.Data 项目下的 -> Dapper目录下的 -> DapperTaller.cs 文件, 可从这里开始看
作者: 蒋奎
博客: http://www.cnblogs.com/anuo/
欢迎转载,请在明显位置给出出处及链接
写出易调试的SQL(修订版)的更多相关文章
- 写出易调试的SQL
h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...
- 写出易调试的SQL—西科软件
1.前言 上篇 写出易调试的SQL , 带来了一些讨论, 暴露了不能重用执行计划和sql注入问题, 十分感谢园友们的建议 . 经过调整后 ,将原来的SQLHelper 抓SQL 用做调试环境用, 发布 ...
- 写出易于调试的SQL
1.前言 相比高级语言的调试如C# , 调试SQL是件痛苦的事 . 特别是那些上千行的存储过程, 更是我等码农的噩梦. 在将上千行存储过程的SQL 分解到 C# 管理后, 也存在调试的不通畅, 如何让 ...
- 如何写出性能好的sql
开发人员是很少注意SQL对数据库性能影响的重要性的,大多程序员都会认为SQL是比较简单的,需要的时候查查手册就可以了,很少有深究的. 这样的观念对大型系统的开发是致命的,需要纠正这样的观念. 造成这样 ...
- Mysql写出高质量的sql语句的几点建议
CleverCode在实际的工作也写过一些低效率的sql语句.这些语句会给数据库带来非常大的压力.最基本的表现就是sql语句执行慢,后来逐渐的去优化和尝试. 总结了一些高质量的sql语句的写法.这里C ...
- Oracle 如何写出高效的 SQL
转自:Oracle 如何写出高效的 SQL 要想写出高效的SQL 语句需要掌握一些基本原则,如果你违反了这些原则,一般情况下SQL 的性能将会很差. 1. 减少数据库访问次数连接数据库是非常耗时的,虽 ...
- SQL SERVER全面优化-------写出好语句是习惯
前几篇文章已经从整体提供了诊断数据库的各个方面问题的基本思路...也许对你很有用,也许你觉得离自己太远.那么今天我们从语句的一些优化写法及一些简单优化方法做一个介绍.这对于很多开发人员来说还是很有用的 ...
- Oracle如何写出高效的SQL
转载:http://www.blogjava.net/ashutc/archive/2009/07/19/277215.html 1.选择最有效率的表明顺序(只在基于规则的优化器中有效) Oracle ...
- [转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine)
[转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine) http://blogs.technet. ...
随机推荐
- 2015 西雅图微软总部MVP峰会记录
2015 西雅图微软总部MVP峰会记录 今年决定参加微软MVP全球峰会,在出发之前本人就已经写这篇博客,希望将本次会议原汁原味奉献给大家 因为这次是本人第一次写会议记录,写得不好的地方希望各位园友见谅 ...
- 基于本地存储的kvm虚拟机在线迁移
基于本地存储的kvm虚拟机在线迁移 kvm虚拟机迁移分为4种(1)热迁移基于共享存储(2)热迁移基于本地存储(3)冷迁移基于共享存储(4)冷迁移基于本地存储 这里介绍的是基于本地存储的热迁移 动态块迁 ...
- SSH实战 · 唯唯乐购项目(上)
前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...
- C#多线程之线程同步篇2
在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ...
- [.NET] C# 知识回顾 - Event 事件
C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...
- Android Studio分类整理res/Layout中的布局文件(创建子目录)
res/layout中的布局文件太杂,没有层次感,受不了的我治好想办法解决这个问题. 前几天看博客说可以使用插件分组,可惜我没找到.知道看到另一篇博客时,才知道这个方法不能用了. 不能用插件,那就手动 ...
- 信息安全-5:RSA算法详解(已编程实现)[原创]
转发注明出处:http://www.cnblogs.com/0zcl/p/6120389.html 背景介绍 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加 ...
- liunx 磁盘管理命令记录
Linux磁盘管理好坏管理直接关系到整个系统的性能问题. Linux磁盘管理常用三个命令为df.du和fdisk. df:列出文件系统的整体磁盘使用量 du:检查磁盘空间使用量 fdisk:用于磁盘分 ...
- 记录在Windows上安装和使用Oracle数据库过程中的坑
1.安装Oracle Oracle软件是免费的,可以去官网下载相应的安装包.但是如果用于商业用途需要购买License.官网上针对各种平台,32位和64位都有,如果在Windows一般会下载到两个文件 ...
- .NET跨平台之旅:将示例站点升级至 .NET Core 1.1 Preview 1
今天微软发布了 .NET Core 1.1 Preview 1(详见 Announcing .NET Core 1.1 Preview 1 ),紧跟 .NET Core 前进的步伐,我们将示例站点 h ...