2011-01-23 31 views
2

在.NET中以编程方式替换参数值后,有没有办法获得CommandText有没有办法通过编程替换参数值后获取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#)。

回答

5

更换可能不会在文本中执行 - 实际上这样做会更麻烦。当驱动程序能够以预先设计的二进制格式分别传输它们时,为什么还要花费如何避免字符串,以特定文本格式表示日期等?

你想达到什么目标?如果这是为了记录的目的,我只需单独记录命令文本和参数。除了更简单之外,如果最终出现问题,则会更清楚:您将能够判断SQL是否已正确参数化。

+0

这是完全粗糙!我使用LINQ DataContext类的ExecuteCommand方法来获取类型化对象(我自己生成的)的列表,并且(愚蠢?)方法只是获取字符串SQL;问题是如果有人使用Oracle,它不会取代参数! [我讨厌数据集和Oracle没有LINQ,我没有找到一个好的NHibernate代码生成器 - 除此之外,我在NHibernate,NLog,F#等环境下工作! SoI生成类似于手写代码> :(] – 2011-01-23 09:16:23

+0

@Kaveh:是使用命名参数的问题,但驱动程序仅支持位置参数?如果要使用带有Oracle的LINQ,可能需要查看。实体框架 – 2011-01-23 09:36:03

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()); 
相关问题