如何在不向服务器提交SQL语句的情况下获取SqlParameter的字符串表示形式?

时间:2011-09-10 18:14:29

标签: c# mysql sql parameters tostring

如何将参数化字符串(如“@ param1,@ param2,@ param3)”转换为普通的SQL语句(就像我执行查询一样)?

这有助于直接用批量(非常长)插入查询中的值替换一组参数,其中可以重用相同的参数名称。

我知道以下问题,但是他们没有提供正确的答案(除了断言它是从单独收到的参数进行转换的服务器):

2 个答案:

答案 0 :(得分:1)

不确定这是否是您正在寻找的,但我为SqlCommand创建了一个名为ToSql()的扩展方法,它声明所有参数,设置文字值,然后使用CommandText生成独立的SQL语句。然后我可以将语句复制并粘贴到SSMS中并从那里继续调试。

我希望我可以与您分享代码,但这是我雇主的财产。此外,它实际上很容易编写,是一个有趣的练习。我将描述它是如何工作的。

例如:

var command = new SqlCommand(@"
    SELECT * 
    FROM Table 
    WHERE 
        Column1 = @Param1 
    AND Column2 = @Param2
");
command.Parameters.AddWithValue("@Param1", 555);
command.Parameters.AddWithValue("@Param2", "StackOverflow's cool");
...

现在,在调试时,我只是为command.ToSQL()添加了一个监视,我得到以下文字:

DECLARE @Param1   INT            SET @Param1   = 555
DECLARE @Param2   VARCHAR(MAX)   SET @Param2   = 'StackOverflow''s cool'
SELECT *
FROM Table
WHERE
    Column1 = @Param1
AND Column2 = @Param2

对于存储过程,结果如下所示:

DECLARE @Param1   INT            SET @Param1   = 555
DECLARE @Param2   VARCHAR(MAX)   SET @Param2   = 'StackOverflow''s cool'
EXECUTE Some_Stored_Procedure
    @Param1 = @Param1
   ,@Param2 = @Param2

我不建议在生产中使用此代码,它可能不能安全地防止SQL注入攻击,但它是一个非常有用的调试工具!

答案 1 :(得分:0)

我刚刚为SQLite找到了类似的内容:

SQLiteCommand cmd = new SQLiteCommand("INSERT INTO `" + rolesTable + "`" +
                " (Rolename, ApplicationName) " +
                " Values($Rolename, $ApplicationName)", conn);

        cmd.Parameters.Add("$Rolename", DbType.String, 255).Value = rolename;
        cmd.Parameters.Add("$ApplicationName", DbType.String, 255).Value = ApplicationName;