使用Parameters从DbCommand获取SQL查询字符串

Bio*_*eek 11 c# mysql sql

就在C#中对MySQL数据库执行SQL查询之前,我想记录将要执行的查询.我现在所拥有的只是记录SELECT * FROM foo WHERE Id = @Id我希望看到的地方SELECT * FROM foo WHERE Id = 5.我怎么做?

    DbCommand dbCommand = dbFactory.CreateCommand();
    dbCommand.CommandText = "SELECT * FROM foo WHERE Id = @Id";

    DbParameter param = dbCommand.CreateParameter();
    param.ParameterName = "@Id";
    param.Value = 5;

    dbCommand.Parameters.Add(param);

    dbConnection.Open();
    Log.AddVerbose(String.Format("SQL query: {0}", dbCommand.CommandText));
    dbCommand.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)

Anu*_*raj 17

如果您尝试登录,则可以执行此类扩展方法.

public static string GetGeneratedQuery(this SqlCommand dbCommand)
{
    var query = dbCommand.CommandText;
    foreach (var parameter in dbCommand.Parameters)
    {
            query = query.Replace(parameter.ParameterName, parameter.Value.ToString());
    }

    return query;
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它.

Log.AddVerbose(String.Format("SQL query: {0}", GetGeneratedQuery(dbCommand)));
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅适用于命名参数。如果您使用的数据库带有简单的“?”占位符,则您的订单会匹配。 (2认同)
  • 有一个问题.如果param值是String类型,则该值将带有撇号,但上面的示例不起作用.[这是一个更完整的解决方案](http://stackoverflow.com/questions/5356467/from-net-can-i-get-the-full-sql-string-generated-by-a-sqlcommand-object-with -s) (2认同)