我的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
我无法弄清楚如何访问上面的内容?
答案 0 :(得分:4)
查看实际查询的一种方法是使用SQL事件探查器。
答案 1 :(得分:2)
查询永远不会以
执行SELECT * FROM Books WHERE BookID = 3
实际上是传递参数的参数化查询。
您可以使用相关参数对查询执行“查找/替换”,以查看它的外观。
答案 2 :(得分:2)
(这个答案假定使用SqlClient实现。)
不,你看不到执行的sql代码。 SqlCommand类调用sp_execute(请参阅SqlCommand.BuildExecute方法以获取确切的实现),该方法将查询与参数分开。您需要使用Sql Profiler来查看执行的确切查询。
您可以使用提供的DbCommand(来自Selecting事件)来解析CommandText并将参数替换为它们的实际值。这需要一些转义逻辑,它不是Sql Server执行的确切查询。
答案 3 :(得分: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
答案 4 :(得分:0)
我想你将无法看到你想要的select语句,因为参数不会在值为3的语句中被替换,而是像你写入sql server一样发送(带参数)。
这实际上很好,因为它会阻止你在文本框中注入一些恶意的sql代码,例如。
无论如何,您无法使用以下方法检索传递给参数的值:
cmd.Parameters(0).Value
其中cmd是你的SqlCommand吗?
答案 5 :(得分:0)
这是Adam回答的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
答案 6 :(得分:0)
是的,您可以查看该信息,但您需要为此进行一些编码。
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)}";
}
}
protected void sqlDataSource_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
MyLogger.WriteLine(e.Command.ToSqlStatement());
}