如何将参数化字符串(如“@ param1,@ param2,@ param3)”转换为普通的SQL语句(就像我执行查询一样)?
这有助于直接用批量(非常长)插入查询中的值替换一组参数,其中可以重用相同的参数名称。
我知道以下问题,但是他们没有提供正确的答案(除了断言它是从单独收到的参数进行转换的服务器):
答案 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;