存储过程执行前调用快速打印调试参数
2023-11-15 本文已影响0人
吉凶以情迁
我前面开发的存储过程转代码进行修改快速定位错误,但是
参数是啥值定义还是很麻烦,结合这个,打印出来拷贝
可以更方便的拿参数到数据库测试
分为定义 ,设置值,和打印值,以及执行。
全套
}
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());
}