从SqlCommand对象获取生成的SQL语句?

我有以下代码:

Using cmd As SqlCommand = Connection.CreateCommand

cmd.CommandText = "UPDATE someTable SET Value = @Value"

cmd.CommandText &= " WHERE Id = @Id"

cmd.Parameters.AddWithValue("@Id", 1234)

cmd.Parameters.AddWithValue("@Value", "myValue")

cmd.ExecuteNonQuery

End Using

我想知道是否有任何方法可以将最终的SQL语句作为字符串获得,它看起来应该像这样:

UPDATE someTable SET Value = "myValue" WHERE Id = 1234

如果有人想知道为什么我会这样做:

  • 用于记录(失败)语句
  • 有可能将其复制并粘贴到企业管理器中以进行测试

回答:

虽然不是很完美,但是我为TSQL提出了一些建议-可以很容易地对其进行其他调整…如果没有其他选择,它将为您提供自己的改进起点:)

这样就可以对数据类型和输出参数等执行确定的工作,类似于在SSMS中使用“执行存储过程”。我们主要使用SP,因此“文本”命令不考虑参数等

    public static String ParameterValueForSQL(this SqlParameter sp)

{

String retval = "";

switch (sp.SqlDbType)

{

case SqlDbType.Char:

case SqlDbType.NChar:

case SqlDbType.NText:

case SqlDbType.NVarChar:

case SqlDbType.Text:

case SqlDbType.Time:

case SqlDbType.VarChar:

case SqlDbType.Xml:

case SqlDbType.Date:

case SqlDbType.DateTime:

case SqlDbType.DateTime2:

case SqlDbType.DateTimeOffset:

retval = "'" + sp.Value.ToString().Replace("'", "''") + "'";

break;

case SqlDbType.Bit:

retval = (sp.Value.ToBooleanOrDefault(false)) ? "1" : "0";

break;

default:

retval = sp.Value.ToString().Replace("'", "''");

break;

}

return retval;

}

public static String CommandAsSql(this SqlCommand sc)

{

StringBuilder sql = new StringBuilder();

Boolean FirstParam = true;

sql.AppendLine("use " + sc.Connection.Database + ";");

switch (sc.CommandType)

{

case CommandType.StoredProcedure:

sql.AppendLine("declare @return_value int;");

foreach (SqlParameter sp in sc.Parameters)

{

if ((sp.Direction == ParameterDirection.InputOutput) || (sp.Direction == ParameterDirection.Output))

{

sql.Append("declare " + sp.ParameterName + "\t" + sp.SqlDbType.ToString() + "\t= ");

sql.AppendLine(((sp.Direction == ParameterDirection.Output) ? "null" : sp.ParameterValueForSQL()) + ";");

}

}

sql.AppendLine("exec [" + sc.CommandText + "]");

foreach (SqlParameter sp in sc.Parameters)

{

if (sp.Direction != ParameterDirection.ReturnValue)

{

sql.Append((FirstParam) ? "\t" : "\t, ");

if (FirstParam) FirstParam = false;

if (sp.Direction == ParameterDirection.Input)

sql.AppendLine(sp.ParameterName + " = " + sp.ParameterValueForSQL());

else

sql.AppendLine(sp.ParameterName + " = " + sp.ParameterName + " output");

}

}

sql.AppendLine(";");

sql.AppendLine("select 'Return Value' = convert(varchar, @return_value);");

foreach (SqlParameter sp in sc.Parameters)

{

if ((sp.Direction == ParameterDirection.InputOutput) || (sp.Direction == ParameterDirection.Output))

{

sql.AppendLine("select '" + sp.ParameterName + "' = convert(varchar, " + sp.ParameterName + ");");

}

}

break;

case CommandType.Text:

sql.AppendLine(sc.CommandText);

break;

}

return sql.ToString();

}

沿这些行生成输出…

use dbMyDatabase;

declare @return_value int;

declare @OutTotalRows BigInt = null;

exec [spMyStoredProc]

@InEmployeeID = 1000686

, @InPageSize = 20

, @InPage = 1

, @OutTotalRows = @OutTotalRows output

;

select 'Return Value' = convert(varchar, @return_value);

select '@OutTotalRows' = convert(varchar, @OutTotalRows);

以上是 从SqlCommand对象获取生成的SQL语句? 的全部内容, 来源链接: utcz.com/qa/413422.html

回到顶部