-
sql语句大全之写出易调试的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 = "001", CreateDate = DateTime.Now, Amount = 3, 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/
欢迎转载,请在明显位置给出出处及链接
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式