在.NET中以编程方式替换参数值后,有没有办法获得CommandText
?
假设我们有一个命令:
let cmd = conn.CreateCommand()
cmd.CommandText <- "select * from smsqueue where smsqueueid=:pid"
cmd.CommandType <- CommandType.Text
cmd.Parameters.Add("pid", 0)
我想获得准备好的命令文本;这将是这样的:
select * from smsqueue where smsqueueid=0
有分析器可以获取此信息,但我想在代码中明确地执行此操作(例如,F#或C#)。
答案 0 :(得分:5)
替换可能不会在文本中执行 - 实际上这样做会更麻烦。当驱动程序能够以预先计划的二进制格式单独传输时,为什么还要弄清楚如何转义字符串,用特定文本格式表示日期等?
你想达到什么目标?如果这是为了记录,我只需要分别记录命令文本和参数。除了更容易之外,如果您最终遇到问题,这将更清楚:您将能够判断SQL是否已正确参数化。
答案 1 :(得分:2)
不可能,因为没有构建该命令。程序将您提供的确切命令文本(包括参数名称)以及参数值分别发送到数据库引擎。它从来没有用它来替换它们来想出一个新的字符串。
如果你真的需要这样的东西,你将不得不编写自己的字符串替换函数,但这会产生误导,因为那不是真正发生的事情。
答案 2 :(得分:1)
下面的代码需要在command.execute之前添加,这样就可以打印出可以在SQL中执行的查询。
for (int x = 0; x < cmd.Parameters.Count; x++)
{
if (cmd.Parameters[x].SqlDbType.ToString() == "VarChar" || cmd.Parameters[x].SqlDbType.ToString() == "Char")
{
Response.Write("<BR><BR>Declare " + cmd.Parameters[x].ToString() + " as " + cmd.Parameters[x].SqlDbType.ToString() + "(" + cmd.Parameters[x].Size + ")");
}
else
{
Response.Write("<BR><BR>Declare " + cmd.Parameters[x].ToString() + " as " + cmd.Parameters[x].SqlDbType.ToString());
}
Response.Write("<BR>SET " + cmd.Parameters[x].ToString() + " = '" + cmd.Parameters[x].SqlValue.ToString() + "'");
}
Response.Write("<BR>" + cmd.CommandText.ToString());