简书链接:存储过程执行前调用快速打印调试参数
文章字数:213,阅读全文大约需要1分钟
我前面开发的存储过程转代码进行修改快速定位错误,但是
参数是啥值定义还是很麻烦,结合这个,打印出来拷贝
可以更方便的拿参数到数据库测试
分为定义 ,设置值,和打印值,以及执行。
全套

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
}

public void printExecSqlCommand(SqlCommand sqlCommand)
{
if (!RuntimeConfig.dev)
{
return;
}
StringBuilder sb = new StringBuilder();
sb.Append("--[DEBUG_DEFINE]\n");

int i;
i = 0;

foreach (SqlParameter p in sqlCommand.Parameters)
{


string paramName = p.ParameterName;
string paramValue = p.ParameterName;

/* command.Parameters.Add(paramName, p.SqlDbType, p.Size);
command.Parameters[paramName].Value = p.Value;
command.Parameters[paramName].Direction = p.Direction;//两种写法都可以 但是会导致 如果取值是从SqlParameter[] Params里面取就会得到空
*/
string value = p.Value + "";//传递null会报错,但是空字符串不会
string name = paramName.StartsWith("@") ? paramName : "@"+paramName;
sb.Append(@$"declare {name} varchar(200)='{value}'");
if (i != sqlCommand.Parameters.Count - 1)
{
sb.Append(";");
}
i++;

}
sb.Append(";");
sb.Append("\n--[SET]\n");
i = 0;
foreach (SqlParameter p in sqlCommand.Parameters)
{


string paramName = p.ParameterName;
string paramValue = p.ParameterName;

/* command.Parameters.Add(paramName, p.SqlDbType, p.Size);
command.Parameters[paramName].Value = p.Value;
command.Parameters[paramName].Direction = p.Direction;//两种写法都可以 但是会导致 如果取值是从SqlParameter[] Params里面取就会得到空
*/
string value = p.Value + "";//传递null会报错,但是空字符串不会
string name = paramName.StartsWith("@") ? paramName : "@" + paramName;
sb.Append(@$"set {name}='{value}'");
if (i != sqlCommand.Parameters.Count - 1)
{
sb.Append(";");
}
i++;

}
sb.Append(";");
i = 0;
sb.Append("\n--[PRITN_PARAM]\n");
sb.Append("print ''");
foreach (SqlParameter p in sqlCommand.Parameters)
{


string paramName = p.ParameterName;
string paramValue = p.ParameterName;

string value = p.Value + "";//传递null会报错,但是空字符串不会
string name = paramName.StartsWith("@") ? paramName : "@" + paramName;
sb.Append("+");
sb.Append($"'{name}:'+");
if(p.SqlDbType==SqlDbType.NVarChar || p.SqlDbType == SqlDbType.VarChar)
{
sb.Append(@$"{name}");
}
else
{
sb.Append( @$"CONVERT(VARCHAR(100), {name})");
//sb.Append( @$"(CAST({name} AS NVARCHAR(30))");
}
sb.Append("+','");
i++;

}


sb.Append("\n--[EXECUTE]\n");
sb.Append("\nDECLARE @RC int;\n");
string procName = sqlCommand.CommandText.Contains(".") ? sqlCommand.CommandText : "[dbo].["+sqlCommand.CommandText+"]";

sb.Append(@$" EXECUTE @RC ={procName} ");
StringBuilder sbSelect = new StringBuilder();
foreach (SqlParameter p in sqlCommand.Parameters)
{


string paramName = p.ParameterName;
string paramValue = p.ParameterName;

string value = p.Value + "";//传递null会报错,但是空字符串不会
string name = paramName.StartsWith("@") ? paramName : "@" + paramName;
sb.Append(@$"{name}");
if(p.Direction==ParameterDirection.Output || p.Direction == ParameterDirection.InputOutput)
{
sb.Append(" out");
sbSelect.Append(name + ",");
}
if (i != sqlCommand.Parameters.Count - 1)
{
sb.Append(",");
}
i++;

}
sbSelect.Append("1");
sb.Append(";");
sb.Append(" select "+ sbSelect.ToString());



Debug.WriteLine(sb.ToString());

}