gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:08:47 25 4
gpt4 key购买 nike

如果有一种简单的方法可以在参数替换后返回完整的 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com