写出易调试的SQL

发表于:2017-1-05 10:18  作者:蒋奎   来源:51Testing软件测试网采编

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: 软件开发 数据库 SQL

  1.前言
  相比高级语言的调试如C#,调试SQL是件痛苦的事.特别是那些上千行的存储过程,更是我等码农的噩梦.
  在将上千行存储过程的SQL分解到C#管理后,也存在调试的不通畅,如何让调试流畅些呢,请看后续
  2.常见调试
  2.1通常在Dapper里面一个断点下去,抓到类似如下SQL:
  SELECT
  a.*
  FROMdbo.ptypea
  INNERJOINdbo.PType_PricebONa.typeId=b.PTypeID
  LEFTJOINdbo.PType_UnitscONa.typeId=c.UnitsId
  WHEREa.typeId=@typeidANDa.CreateDate=@Area
  ANDpreprice1=@preprice1ANDdeleted=@deleted
  各种@符号,需要手工替换后才能调试(麻烦),要是能抓到最终SQL就好了
  2.2庆幸的是可以通过SQLServerProfiler来抓到最终SQL
  但是生产环境中的SQLServer,并发执行的SQL非常多,如上图所见,在一大堆SQL里面找到你刚才执行的SQL也比较麻烦,即使可以Ctrl+F调出搜索框来搜索,也要想个好的关键字来搜索,麻烦.
  3.解决方案
  既然我们想要最终的SQL,为毛不在丢给Dapper执行前,就已经是最终SQL了呢,上工具代码:
publicclassSqlHelper
{
publicDictionary<string,object>Param=newDictionary<string,object>();
publicstringReplaceParam(refstringsql)
{
if(Param.Count==0)
{
returnsql;
}
StringBuildersb=newStringBuilder();
sb.Append(sql);
foreach(variteminParam)
{
varparamName=item.Key;
varparamValue=item.Value;
vartype=paramValue.GetType();
if(type==typeof(string)||type==typeof(DateTime))
{
//字符串
sb.Replace($"@{paramName}",$"'{paramValue}'");
}
elseif(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();
returnsql;
}
}
  调用示例:
publicIEnumerable<Ptype>GetPtypeDetail()
{
varsql=@"
SELECTa.*
FROMdbo.ptypea
INNERJOINdbo.PType_PricebONa.typeId=b.PTypeID
LEFTJOINdbo.PType_UnitscONa.typeId=c.UnitsId
WHEREa.typeId=@TypeidANDa.CreateDate=@CreateDate
ANDpreprice1=@preprice1ANDdeleted=@deleted
";
varsqlHelper=newSqlHelper();
sqlHelper.Param.Add("Typeid","001");
sqlHelper.Param.Add("CreateDate",DateTime.Now);
sqlHelper.Param.Add("preprice1",3.62M);
sqlHelper.Param.Add("deleted",true);
sqlHelper.ReplaceParam(refsql);
IEnumerable<Ptype>plist=newList<Ptype>();
using(varcon=SQLServerHelper.GetConnection())
{
plist=con.Query<Ptype>(sql);
}
returnplist;
}
  这样丢给Dapper执行的SQL始终是最终SQL,就不用煞费苦心去抓了.
  PS:有人可能会质疑这样替换的效率,不用担心已测试,C#的字符串替换是非常快的,上面的调用实例,当时的测试结果是微妙和纳秒级别,有兴趣的看管可以再测试.
  4.最后
  现在丢给Dapper执行的不再是充满@参数的SQL,而是一个替换好的最终SQL.
  这样当老板隔老远吼道你说:小蒋,你tm有个XXbug,赶紧看看.
  你可以不慌不忙的在DapperQuery处打个断点
  鼠标放在SQL变量上,轻松的拿到最终SQL进行调试,而不是,手动去替换@参数,又或则在SQLServerProfiler里面大海捞针了!!!

评 论

论坛新帖

顶部 底部


建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海瀛东律师事务所 张楠律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2020, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道