【问题标题】:DbContext ExecuteSQLCommand with no parameters不带参数的 DbContext ExecuteSQLCommand
【发布时间】:2013-04-04 18:30:00
【问题描述】:

我正在尝试传入一个 SQL 字符串来删除一些记录。我正在使用 DbContext.Database.ExecuteSqlCommand 函数,但是除了 SQL 字符串之外,它还需要以下形式的参数列表:params Object[] parameters

因为我不需要发送任何参数,所以我尝试传递 null ,但这会生成一个错误,指出 null 不是有效参数。我找不到该方法的重载。如何发送不需要附加参数的 SQL 命令?这是我的代码示例:

db.Database.ExecuteSqlCommand("DELETE FROM SignoffCommentAttachment 
WHERE SignoffCommentAttachment.SignoffCommentID 
IN (SELECT [SignoffCommentID] FROM [SignoffComments] 
WHERE SignoffID = " + signOffID.ToString() + ")", null);

【问题讨论】:

  • 你看过MDSN DBContext.Execute 命令的解释public int ExecuteSqlCommand( string sql, params Object[] parameters ) 这是方法签名.. 它期望参数为Array msdn.microsoft.com/en-us/library/…
  • 当前形式的Sql Injection Attack 看起来是个不错的案例。
  • 不确定如何攻击它,因为包含此代码的方法只接受一个 int 作为参数。

标签: c# .net sql-server entity-framework


【解决方案1】:

parameters 是一个 params 参数,所以你可以为它传递 0 给多个对象。这应该工作

db.Database.ExecuteSqlCommand("DELETE FROM SignoffCommentAttachment WHERE SignoffCommentAttachment.SignoffCommentID IN (SELECT [SignoffCommentID] FROM [SignoffComments] WHERE SignoffID = " + signOffID.ToString() + ")");

不过,您确实应该参数化 signOffID。类似的东西

db.Database.ExecuteSqlCommand("DELETE FROM SignoffCommentAttachment WHERE SignoffCommentAttachment.SignoffCommentID IN (SELECT [SignoffCommentID] FROM [SignoffComments] WHERE SignoffID = {0})", signOffID);

【讨论】:

  • MSDN 文档没有指出这一点太糟糕了。尽管 {0} 是 string.Format() 命令的标准语法,但它不像 SQL 参数那样遥不可及。我不认为我会猜到这一点。谢谢!
【解决方案2】:

为了获得一点 SQL 注入保护,您应该在此处使用参数。你有一个参数。您可能还应该使用存储过程,但这是另一个问题。

我会这样编码...

var parms = new ParameterCollection();

parms.Add("signOffId", signOffID);

db.Database.ExecuteSqlCommand("DELETE FROM SignoffCommentAttachment 
WHERE SignoffCommentAttachment.SignoffCommentID 
IN (SELECT [SignoffCommentID] FROM [SignoffComments] 
WHERE SignoffID = @signOffID)", parms);

我没有在那里检查我的语法,但这是我会使用的方法。只有我会使用存储过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2017-06-19
    相关资源
    最近更新 更多