【问题标题】:Manually sanitize SQL parameters手动清理 SQL 参数
【发布时间】:2014-10-21 14:58:15
【问题描述】:

我想运行如下脚本:

CREATE LOGIN [me] WITH PASSWORD = @0

然后像这样运行它:

var createUserCommand = conn.CreateCommand();
createUserCommand.CommandText = script;
createUserCommand.Parameters.AddWithValue("@0", passwordDecrypted);

但是,这会引发:

System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的第一次机会异常
附加信息:“@0”附近的语法不正确。

根据我在网上阅读的内容(无官方信息,仅来自 SO 答案/cmets),无法将 SQL 参数与 DDL 语句一起使用。欢迎链接到官方文档!

好的。我确实需要这个参数化。在我看来,有两种选择:

  • 我手动清理 (.Replace("'", "''") => 我怎样才能做到最好?
  • 我调用 .NET 为我清理。但是我认为这在 ADO.NET 中没有经过清理,而只是通过 SQL Server 进行了清理,并在那里进行了清理......

最好的方法是什么?

【问题讨论】:

    标签: sql ado.net ddl


    【解决方案1】:

    你需要逃脱的只是单个' 到 2 x '

    commandText = string.Format("CREATE LOGIN [me] WITH PASSWORD = '{0}'", pass.Replace("'", "''"));
    

    另一种方法是创建一个带有密码参数的存储过程,并使用它来构建一个CREATE LOGIN 字符串,然后您可以使用sp_executeSQL

    【讨论】:

    • 谢谢,这很容易!你能指出更多的文档就足够了吗?
    • 我找不到任何权威文档,但这里提到了; msdn.microsoft.com/en-us/magazine/cc163523.aspx / stackoverflow.com/questions/10476252/…
    • 根据 MSDN 链接,使用 QUOTENAME (SQL) 不是比使用 String.Replace() (.NET) 更好的选择
    • 它不会和你一起 DML(它不会像 PASSWORD = function(..) 并且你将密码作为字符串文字,所以你最终会尝试做 QUOTENAME('XXX'YYY', '''') 这是无效的
    • 好的,感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多