5

我对我的 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

我不知道如何访问上述内容?

4

7 回答 7

4

查看实际查询的一种方法是使用 SQL Profiler。

于 2009-03-27T13:21:48.823 回答
2

查询永远不会执行为

SELECT * FROM Books WHERE BookID = 3

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

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

于 2009-03-27T13:33:01.137 回答
2

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

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

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

于 2009-03-27T13:34:34.457 回答
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
于 2009-05-17T06:20:14.377 回答
0

我猜您将无法像您希望的那样看到 select 语句,因为该参数在语句中没有被替换为值 3,而是像您将其写入 sql server(使用参数)一样发送。

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

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

cmd.Parameters(0).Value

你的 SqlCommand 在哪里 cmd?

于 2009-03-27T13:27:15.957 回答
0

这是亚当答案的 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
于 2013-10-19T02:41:44.110 回答
0

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

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

    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. OnSelecting事件处理程序添加到页面上的 SqlDataSource 控件
  2. 在你的代码后面

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

于 2021-01-28T21:46:45.350 回答