(点击
上方公众号
,可快速关注)
来源:蒋奎
链接:
www.cnblogs.com/anuo/p/6241557.html
如有好文章投稿,请点击 → 这里了解详情
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