【问题标题】:Display full query in statement with parameters在带参数的语句中显示完整查询
【发布时间】:2015-07-21 12:08:35
【问题描述】:

我在 vb.net 中调试查询时遇到了一些麻烦。 我只想获得其中包含价值的完整查询。我使用参数在我的查询中添加值。 这是我的代码:

'Select query
Dim stm As String = "SELECT *, FORMAT(NOW(),'DD-MM-YYYY HH:NN:SS') as waktu FROM [user] WHERE [username]=? AND [password]=? AND active=TRUE"
Dim cmd As OleDbCommand = New OleDbCommand(stm, db)

'Parameters
Using md5Hash As MD5 = MD5.Create()
    Dim pwd As String = GetMd5Hash(md5Hash, Me.tx_password.Text)
    cmd.Parameters.Add("p1", OleDbType.VarChar, 25).Value = Me.tx_username.Text
    cmd.Parameters.Add("p2", OleDbType.VarChar, 32).Value = pwd
End Using

'Execute Query
MsgBox(stm)
Dim reader As OleDbDataReader = cmd.ExecuteReader(CommandBehavior.SingleRow)

使用这段代码,我得到的结果如下:

SELECT *, FORMAT(NOW(),'DD-MM-YYYY HH:NN:SS') as waktu FROM [user]
WHERE [username]=? AND [password]=? AND active=TRUE

如何得到这样的结果:

SELECT *, FORMAT(NOW(),'DD-MM-YYYY HH:NN:SS') as waktu FROM [user]
WHERE [username]='adminUser' AND [password]='adminPassword' AND active=TRUE

【问题讨论】:

  • 真的是故意在星号后面加个comman吗???选择 *, ???
  • 是的,因为我也想在结果中获得当前时间

标签: vb.net sql-parametrized-query


【解决方案1】:

参数不连接到命令中,它们单独发送到数据库。否则,使用参数化查询和使用串联查询之间没有区别。 (see the answer to a similar question here.)
这意味着为了调试您的查询,如果您的 sql 是由 vb.net 代码连接的,您将不得不更加努力地工作。

如果您的数据库支持存储过程,我建议您开始使用它们而不是参数化查询。您可能会获得性能,并且会更容易调试。
如果没有,您可以将查询原样复制到sql编辑器,并使用调试器选项之一来获取参数的值并将它们一一复制到sql编辑器。

【讨论】:

  • 好的,我明白了。我使用参数的原因是为了防止sql注入。感谢您的回答。
  • 这是一个很好的理由。事实上,即使不是唯一的,也可能是最好的。存储过程将为您带来这些好处以及其他好处,例如封装表结构、预编译的查询计划等。
【解决方案2】:

把这段代码放在你已经添加了参数的下面,你将在debugSQL中拥有将要执行的SQL语句

Dim debugSQL As String = cmd.CommandText

For Each param As SqlParameter In cmd.Parameters
    debugSQL = debugSQL.Replace(debugSQL.ParameterName, debugSQL.Value.ToString())
Next

【讨论】:

  • 这将回答问题,但它不完全是将执行的 sql 语句。如果是,那么参数化查询将与串联查询相同。对此进行测试的一个好方法是使用带有撇号的 varchar 参数。尝试运行参数化查询,然后尝试运行 debugSQL。
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 2019-07-22
  • 2016-08-17
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
相关资源
最近更新 更多