这篇文章主要介绍了怎么写出易调试的sql,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
1.前言
相比高级语言的调试如C# , 调试sql是件痛苦的事 . 特别是那些上千行的存储过程, 更是我等码农的噩梦.
在将上千行存储过程的sql 分解到 C# 管理后, 也存在调试的不通畅, 如何让调试流畅些呢
2.常见调试
2.1 通常在Dapper 里面一个断点下去, 抓到类似如下sql:
SELECT a.* FROM dbo.ptype a INNER JOIN dbo.PType_Price b ON a.typeId=b.PTypeID LEFT JOIN dbo.PType_Units c ON a.typeId=c.UnitsId WHERE a.typeId=@typeid AND a.CreateDate=@Area AND preprice1=@preprice1 AND deleted=@deleted
各种@符号, 需要手工替换后才能调试(麻烦), 要是能抓到最终sql就好了
2.2 庆幸的是可以通过sqlServer Profiler 来抓到最终sql
但是生产环境中的sqlServer, 并发执行的sql 非常多, 如上图所见, 在一大堆sql 里面找到你刚才执行的sql也比较麻烦, 即使可以Ctrl + F 调出搜索框来搜索, 也要想个好的关键字来搜索 , 麻烦.
3.解决方案
既然我们想要最终的sql , 为毛不在丢给Dapper 执行前, 就已经是最终sql了呢, 上工具代码:
public class sqlHelper { public Dictionary<string, object> Param = new Dictionary<string, object>(); public string ReplaceParam(ref string sql) { if (Param.Count == 0) { return sql; } StringBuilder sb = new StringBuilder(); sb.Append(sql); foreach (var item in Param) { var paramName = item.Key; var paramValue = item.Value; var type = paramValue.GetType(); if (type == typeof(string) || type == typeof(DateTime)) { //字符串 sb.Replace($"@{paramName}", $"'{paramValue}'"); } else if (type == typeof(bool)) { //bool 类型 if (paramValue.ToString() == "True") { sb.Replace($"@{paramName}", "1"); } else { sb.Replace($"@{paramName}", "0"); } } else { //数值 sb.Replace($"@{paramName}", paramValue.ToString()); } } sql = sb.ToString(); return sql; } }
调用示例:
public IEnumerable<Ptype> GetPtypeDetail() { var sql = @" SELECT a.* FROM dbo.ptype a INNER JOIN dbo.PType_Price b ON a.typeId=b.PTypeID LEFT JOIN dbo.PType_Units c ON a.typeId=c.UnitsId WHERE a.typeId=@Typeid AND a.CreateDate=@CreateDate AND preprice1=@preprice1 AND deleted=@deleted "; var sqlHelper = new sqlHelper(); sqlHelper.Param.Add("Typeid", "001"); sqlHelper.Param.Add("CreateDate", DateTime.Now); sqlHelper.Param.Add("preprice1", 3.62M); sqlHelper.Param.Add("deleted", true); sqlHelper.ReplaceParam(ref sql); IEnumerable<Ptype> plist = new List<Ptype>(); using (var con = sqlServerHelper.GetConnection()) { plist = con.Query<Ptype>(sql); } return plist; }
这样丢给Dapper 执行的sql 始终是最终sql, 就不用煞费苦心去抓了.
PS: 有人可能会质疑这样替换的效率,不用担心已测试 , C#的字符串替换是非常快的, 上面的调用实例, 当时的测试结果是 微妙和纳秒级别, 有兴趣的看管可以再测试.
4. ***
现在丢给Dapper执行的不再是 充满@参数的sql , 而是一个替换好的最终sql.
这样当老板隔老远吼道你说: 小蒋, 你tm 有个XX bug ,赶紧看看.
你可以不慌不忙的在 Dapper Query处打个断点
鼠标放在sql变量上, 轻松的拿到最终sql进行调试, 而不是, 手动去替换@参数, 又或则在sqlServer Profiler 里面大海捞针了!!!
感谢你能够认真阅读完这篇文章,希望小编分享的“怎么写出易调试的sql”这篇文章对大家有帮助,同时也希望大家多多支持编程之家,关注编程之家行业资讯频道,更多相关知识等着你来学习!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。