我可以获取从SqlDataSource执行的查询吗?

时间:2009-03-27 13:18:19

标签: c# asp.net sqldatasource

我的SqlDataSource上的SelectCommand有一个sql查询。它看起来如下:

SELECT * FROM Books WHERE BookID = @BookID

TextBox使用Asp:ControlParameter提供@BookID参数。

当我单步执行代码时查看SelectCommand时,我看到了:

SELECT * FROM Books WHERE BookID = @BookID

我想要实际看到的是,如果此人在TextBox中键入3,我想看到

SELECT * FROM Books WHERE BookID = 3

我无法弄清楚如何访问上面的内容?

7 个答案:

答案 0 :(得分:4)

查看实际查询的一种方法是使用SQL事件探查器。

答案 1 :(得分:2)

查询永远不会以

执行
SELECT * FROM Books WHERE BookID = 3

实际上是传递参数的参数化查询。

您可以使用相关参数对查询执行“查找/替换”,以查看它的外观。

答案 2 :(得分:2)

(这个答案假定使用SqlClient实现。)

不,你看不到执行的sql代码。 SqlCommand类调用sp_execute(请参阅SqlCommand.BuildExecute方法以获取确切的实现),该方法将查询与参数分开。您需要使用Sql Profiler来查看执行的确切查询。

您可以使用提供的DbCommand(来自Selecting事件)来解析CommandText并将参数替换为它们的实际值。这需要一些转义逻辑,它不是Sql Server执行的确切查询。

答案 3 :(得分:1)

Public Function GenSQLCmd(ByVal InSqlCmd As String, ByVal p As Data.Common.DbParameterCollection) As String
    For Each x As Data.Common.DbParameter In p
        InSqlCmd = Replace(InSqlCmd, x.ParameterName, x.Value.ToString)
    Next
    Return InSqlCmd
End Function

答案 4 :(得分:0)

我想你将无法看到你想要的select语句,因为参数不会在值为3的语句中被替换,而是像你写入sql server一样发送(带参数)。

这实际上很好,因为它会阻止你在文本框中注入一些恶意的sql代码,例如。

无论如何,您无法使用以下方法检索传递给参数的值:

cmd.Parameters(0).Value

其中cmd是你的SqlCommand吗?

答案 5 :(得分:0)

这是Adam回答的C#版本

public string GenSQLCmd(string InSqlCmd, System.Data.Common.DbParameterCollection p) {
    foreach (System.Data.Common.DbParameter x in p) {
        InSqlCmd = InSqlCmd.Replace(x.ParameterName, "'" + x.Value.ToString() + "'");
    }
    return InSqlCmd;
}

用法:

string DebugQuery = GenSQLCmd(cmd.CommandText, cmd.Parameters); //cmd is a SqlCommand instance

答案 6 :(得分:0)

是的,您可以查看该信息,但您需要为此进行一些编码。

  1. 创建一个名为 ToSqlStatement
  2. 的扩展方法

    public static class SqlExtensions
    {
        public static string ToSqlStatement(this IDbCommand cmd)
        {
            var keyValue = new List<string>();
            foreach (SqlParameter param in cmd.Parameters)
            {
                var value = param.Value == null ? "NULL" : "'" + param.Value + "'";
                keyValue.Add($"{param.ParameterName}={value}");
            }
            return $"{(cmd.CommandType == CommandType.StoredProcedure ? "exec " : string.Empty)}{cmd.CommandText} {string.Join(", ", keyValue)}";
        }
    }

  1. 向页面上的 SqlDataSource 控件添加 OnSelecting 事件处理程序
  2. 在你背后的代码

    protected void sqlDataSource_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        MyLogger.WriteLine(e.Command.ToSqlStatement());
    }