写出易调试的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注入的优势.
写出易调试的SQL—西科软件的更多相关文章
- 写出易调试的SQL(修订版)
h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...
- 写出易调试的SQL
h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...
- 写出易于调试的SQL
1.前言 相比高级语言的调试如C# , 调试SQL是件痛苦的事 . 特别是那些上千行的存储过程, 更是我等码农的噩梦. 在将上千行存储过程的SQL 分解到 C# 管理后, 也存在调试的不通畅, 如何让 ...
- 《西科软件》一个高级PHP工程师所应该具备的
初次接触PHP,就为他的美所折服,于是一发不可收拾.很多面试,很多人员能力要求都有"PHP高级工程师的字眼",如果您真心喜欢PHP,并且您刚起步,那么我简单说说一个PHP高级工程师 ...
- 如何写出性能好的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 ...
随机推荐
- SpringMVC 自动封装枚举类的方法
springmvc默认无法自动封装枚举类,解决方法如下: 1.枚举类 public enum GoodsPromoteEnum { /** * 0 精品 */ fine("精品", ...
- this关键字
class Demothis关键字//哪个对象在调用this所在的函数,this就代表哪个对象.{ //当定义类中功能时,该函数内部要用到该函数的对象时,这时用this来表示这个对象. public ...
- mysql 连接空闲超8小时自动断开连接问题(linux)
在mysql配置文件里添加wait_timeout和interactive_timeout两个值 [mysqld] wait_timeout= interactive_timeout= 超时时间,10 ...
- 关于Hibernate XXX is not mapped 错误
我的实体类是这么配置的 @Entity(name="EntityName") //必须,name为可选,对应数据库中一的个表 就会出现 XXX is not mapped. ...
- wampserver配置域名
装载自http://blog.csdn.net/znb26/article/details/51204313
- 主机WIFI网络环境下,Linux虚拟机网络设置
在主机使用WIFI网络环境下,怎么样进行虚拟机静态ip设置和连接互联网呢,原理什么太麻烦,另类的网络共享而已: 1.其实简单将网络连接模式设置成NAT模式即可. 2.虚拟网络编辑器依旧是桥接模式,选择 ...
- stringbuffer和stringbuilder
StringBuffer是线程安全的可变字符序列.长度可变,类型任意,最终都要转换为字符串存储.是一个字符串缓冲区,是一个容器.用于临时存储数据.不过StringBuffer缓冲区内部是由数组来存储的 ...
- 关于<textArea>控件下显示不出其它控件
今天在写页面控件时发现我添加一个<textarea>后,在其下方的控件都显示不出来了,后来发现我忘写结束标记</textarea>了 以后该写结束标记还要写啊!
- DICOM图像像素值(灰度值)转换为CT值
CT值的单位是Hounsfield,简称为Hu,范围是-1024-3071.用于衡量人体组织对X射线的吸收率,设定水的吸收率为0Hu. 在DICOM图像读取的过程中,我们会发现图像的像素值有可能不是这 ...
- tp框架总结(二)
一.函数库和类库 项目中的常用的函数库要封装到项目Common/function.php中 在项目中可以直接调用 [ 函数();] import方法是ThinkPHP内建的类库导入方法,提供了方便 ...