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(修订版)的更多相关文章

  1. 写出易调试的SQL

    h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...

  2. 写出易调试的SQL—西科软件

    1.前言 上篇 写出易调试的SQL , 带来了一些讨论, 暴露了不能重用执行计划和sql注入问题, 十分感谢园友们的建议 . 经过调整后 ,将原来的SQLHelper 抓SQL 用做调试环境用, 发布 ...

  3. 写出易于调试的SQL

    1.前言 相比高级语言的调试如C# , 调试SQL是件痛苦的事 . 特别是那些上千行的存储过程, 更是我等码农的噩梦. 在将上千行存储过程的SQL 分解到 C# 管理后, 也存在调试的不通畅, 如何让 ...

  4. 如何写出性能好的sql

    开发人员是很少注意SQL对数据库性能影响的重要性的,大多程序员都会认为SQL是比较简单的,需要的时候查查手册就可以了,很少有深究的. 这样的观念对大型系统的开发是致命的,需要纠正这样的观念. 造成这样 ...

  5. Mysql写出高质量的sql语句的几点建议

    CleverCode在实际的工作也写过一些低效率的sql语句.这些语句会给数据库带来非常大的压力.最基本的表现就是sql语句执行慢,后来逐渐的去优化和尝试. 总结了一些高质量的sql语句的写法.这里C ...

  6. Oracle 如何写出高效的 SQL

    转自:Oracle 如何写出高效的 SQL 要想写出高效的SQL 语句需要掌握一些基本原则,如果你违反了这些原则,一般情况下SQL 的性能将会很差. 1. 减少数据库访问次数连接数据库是非常耗时的,虽 ...

  7. SQL SERVER全面优化-------写出好语句是习惯

    前几篇文章已经从整体提供了诊断数据库的各个方面问题的基本思路...也许对你很有用,也许你觉得离自己太远.那么今天我们从语句的一些优化写法及一些简单优化方法做一个介绍.这对于很多开发人员来说还是很有用的 ...

  8. Oracle如何写出高效的SQL

    转载:http://www.blogjava.net/ashutc/archive/2009/07/19/277215.html 1.选择最有效率的表明顺序(只在基于规则的优化器中有效) Oracle ...

  9. [转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine)

    [转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine) http://blogs.technet. ...

随机推荐

  1. NodeJs在Linux下使用的各种问题

    环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...

  2. Apache Ignite之集群应用测试

    集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统 (源码购买说明)

    系列目录 升级日志 !!!重大版本更新:于2016-12-20日完成了系统的结构重构并合并简化了T4(这是一次重要的更新,不需要修改现有功能的代码),代码总行数比上个版本又少了1/3.更新了代码生成器 ...

  4. 模拟AngularJS之依赖注入

    一.概述 AngularJS有一经典之处就是依赖注入,对于什么是依赖注入,熟悉spring的同学应该都非常了解了,但,对于前端而言,还是比较新颖的. 依赖注入,简而言之,就是解除硬编码,达到解偶的目的 ...

  5. NET Core-学习笔记(三)

    这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...

  6. Javascript实现HashTable类

    散列算法可以尽快在数据结构中找出指定的一个值,因为可以通过Hash算法求出值的所在位置,存储和插入的时候都按照Hash算法放到指定位置. <script> function HashTab ...

  7. 【Java大系】Java快速教程

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领 ...

  8. es6小白学习笔记(一)

    1.let和const命令 1.es6新增了let和const命令,与var用法类似,但它声明的变量只在let所在的代码块内有效(块级作用域,es5只有全局和函数作用域) { let a = 1; v ...

  9. Ajax部分

    Ajax的概念 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是一种用于创建快速动态网页的技术. 动态网页:是指 ...

  10. 【SAP业务模式】之ICS(一):业务详述

    PS:本专题系列讲述如何在SAP系统中实现ICS的业务模式,本系列博文系原创,如要转载引用,请保持原文一致并注明出处! SAP系统自身功能非常强大,支持多种业务模式,通过前台后台的配置就可以实现多种效 ...