有没有办法在以编程方式替换参数值后获取CommandText?

时间:2011-01-23 09:01:48

标签: c# database ado.net f#

在.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#)。

3 个答案:

答案 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());