.net - 如何捕获带有替换参数的 SQL? (.NET,SqlCommand)

标签 .net sql vb.net ado.net sqlcommand

如果有一种简单的方法可以在参数替换后返回完整的 SQL 语句?即,我想保留该程序运行的所有 SQL 的日志文件。

或者,如果我想这样做,我是否只想摆脱参数,并以老派的方式进行整个查询,在一个大字符串中?

简单示例:我想捕获输出:

从 EnrollmentSubCategory 中选择 subcatId,其中 catid = 1

..从这段代码:

    Dim subCatSQL As String = "SELECT subcatId FROM EnrollmentSubCategory WHERE catid = @catId"
    Dim connectionString As String = "X"
    Dim conn As New SqlConnection(connectionString)
    If conn.State = ConnectionState.Closed Then
        conn.Open()
    End If
    Dim cmd As New SqlCommand(subCatSQL, conn)
    With cmd
        .Parameters.Add(New SqlParameter("@catId", SqlDbType.Int, 1)) 
    End With

    Console.WriteLine("Before: " + cmd.CommandText)
    cmd.Prepare()
    Console.WriteLine("After: " + cmd.CommandText)

我曾假设 Prepare() 会进行替换,但显然不是。

想法?建议?提前致谢。

最佳答案

不,.Prepare不这样做,实际上命令中的任何内容都没有。参数值永远不会被替换到实际的命令字符串中。它单独发送到数据库,这有几个原因:

  • 这允许 sqlserver(或其他 dbs)为您的查询缓存查询计划并在下次重用它。当每次向数据库发送不同的命令文本字符串时,数据库每次都要制定一个计划。
  • 通过将参数发送到划分的db,对sql注入(inject)攻击有天然的防御。

  • 除非您使用的是非常旧的数据库(sql server 7?),.Prepare()没有必要,实际上并没有为您做任何事情。它曾经很有帮助,因为它会在服务器上编译查询,但现在它会自动为您完成。我没用过.Prepare()在很长的时间。

    嗯。望 here看来.Prepare()仍然为您做一些事情:如果任何值大于参数定义的长度, .Prepare() 会截断该值,以便在执行时不会收到错误并且查询成功。凉爽的。

    关于.net - 如何捕获带有替换参数的 SQL? (.NET,SqlCommand),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2867974/

    相关文章:

    c# - ThreadPool.QueueUserWorkItem 使用 ASP.Net

    C#:当我尝试移动窗口、单击外部或最小化窗口时,窗口会挂起

    c# - 代码分析 Microsoft.Naming 关于缩写 "ID"的警告

    sql - 是否可以将数据提交到 SQL 数据库中,等待它完成,然后使用 Classic ASP 返回从 SQL 生成的 ID?

    c# - MSMQ:MessageQueue.Close() 在 .EndReceive() 处抛出异常 -1073741536

    mysql - 将外键插入表中

    mysql - HQL:计算集合中的空值

    c# - 将指针传递给另一个进程

    vb.net - 如何从 VB.NET 2008 中的数据表中删除多行?

    .net - 如何测试在VB.net TabControl中选择了哪个选项卡