【问题标题】:SqlParameter vs array of objectSqlParameter vs 对象数组
【发布时间】:2020-12-13 01:33:15
【问题描述】:

我有一个包含许多参数的存储过程,我一直在使用以下方法来返回结果:

db.Database.SqlQuery<GetListCamera_Result>("Camera.sp_get_list_camera @room_name, @disk_status, 
    @signal_loss_reason, @department_id , @sortColumnName, @sortDirection, @start, @length",
                    new SqlParameter("room_name", room_name),
                    new SqlParameter("disk_status", disk_status),
                    new SqlParameter("department_id", department),
                    new SqlParameter("signal_loss_reason", reason),
                    new SqlParameter("sortColumnName", sortColumnName),
                    new SqlParameter("sortDirection", sortDirection),
                    new SqlParameter("start", start),
                    new SqlParameter("length", length)).ToList();

我看到我的一位前辈使用这些比我的更清洁:

db.Database.SqlQuery<GetLiquidbooks_Result>("sp_get_liquidbooks {0}, {1}, {2}, {3}, {4}",
    new object[] { LiquidCode, LibID, LocPrefix, LocID, UserID }).ToList();

有什么区别,如果我改用他的,我需要注意什么

【问题讨论】:

    标签: asp.net-mvc stored-procedures


    【解决方案1】:

    我认为你的方法更安全。但是,如果你想让它更简单,你可以参考这个article,你不必初始化一个SqlParameter实例,但是@p1 @p2语法仍然是必不可少的。在文章的第一节中,也提到了应该注意这一点。

    AFAIK,SqlQuery 不会阻止 SQL 注入,这意味着如果我将 DROP 命令传递到您的第二个示例中,该表可能会被永久删除。因此,前辈写的可能会暴露潜在的安全风险,请确保在查询中正确使用参数以防范此类攻击。

    关于第二个示例,考虑使用ObjectContext.ExecuteStoreQuery&lt;T&gt;(),它允许您将具有{0} {1} 语法的查询字符串和对象数组作为参数传递给方法。此方法实际上调用CreateStoreCommand,它将您的查询和对象转换为参数化查询。但是SqlQuery 好像不行。


    仅供参考:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-04
      • 2023-03-10
      • 2013-03-09
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多