写出易调试的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 ...
随机推荐
- FreeBSD从零开始---安装后配置(二)
系统优化及安全设置 上次说了FreeBSD基本的软件安装和配置,接下来会说系统的详细配置和安全性设置 一.系统优化设置 1.网络相关设置 网卡和IP地址设置: 如果在安装时没有设置IP ...
- Mono Fragment之间转换
var newFragment = new mybacklogF (); var ft = FragmentManager.BeginTransaction (); ft.Replace (Resou ...
- Chrome和Firefox浏览器执行new Date() 函数传参数得到不同结果的陷阱
某日,同事问到关于new Date() 函数传参数,在火狐浏览器和谷歌浏览器控制台运行,会得到不同的结果,刚开始觉得不可能,后来实际操作才发现此陷阱 var date = new Date('2014 ...
- javascript_this的用法
javascript : this的用法 1.this代表全局对象 2.作为函数对象的公共方法(new对象后,可以调用带this关键字的属性) 总结:如果在javascript语言里没有通过new(包 ...
- 慕课网-Java入门第一季-6-9
来源:http://www.imooc.com/code/1571 所谓二维数组,可以简单的理解为是一种“特殊”的一维数组,它的每个数组空间中保存的是一个一维数组. 那么如何使用二维数组呢,步骤如下: ...
- SqlServer实现先将所有数据排好序再进行分页
平时,我们对数据进行分页,然后将分页后的数据再进行排序输出.这样做只是针对每次请求,也就是前TOP个数据进行了排序,并不是将数据库中的所有的数据进行了排序.当我们需要将数据库中的所有数据排序后在进行分 ...
- sublimetext 3 set
from https://segmentfault.com/a/1190000002596724{ "font_size": 21, "highlight_line&qu ...
- STL容器适配器 stack, queue
stack是一种后进先出(last in first out)的数据结构.它只有一个出口,如图所示.stack允许新增元素,删除元素,取得最顶端元素.但除了最顶端外,没有其他任何地方可以存储stack ...
- 【转】C#大文件读取和查询--内存映射
笔者最近需要快速查询日志文件,文件大小在4G以上. 需求如下: 1.读取4G左右大小的文件中的指定行,程序运行占用内存不超过500M. 2.希望查询1G以内容,能控制在20s左右. 刚开始觉得这个应该 ...
- The C Programming Language Exercise
1-9 : Write a program to copy its input to its output, replacing each string of one or more blanks b ...