简书链接:存储过程执行前调用快速打印调试参数
文章字数: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());
}
|