在带有参数的语句中显示完整查询

Display full query in statement with parameters

我在调试 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

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

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

将此代码放在您已添加参数的下方,您将在 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