首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlParameter与对象数组

SqlParameter与对象数组
EN

Stack Overflow用户
提问于 2020-12-05 01:32:17
回答 1查看 47关注 0票数 1

我有一个具有许多参数的存储过程,并且我一直使用以下内容来返回结果:

代码语言:javascript
复制
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();

我看到我的一位前辈用的比我的干净多了:

代码语言:javascript
复制
db.Database.SqlQuery<GetLiquidbooks_Result>("sp_get_liquidbooks {0}, {1}, {2}, {3}, {4}",
    new object[] { LiquidCode, LibID, LocPrefix, LocID, UserID }).ToList();

有什么不同?如果我切换到他的系统,我需要注意什么

EN

回答 1

Stack Overflow用户

发布于 2020-12-13 01:33:16

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

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

关于第二个示例,请考虑使用ObjectContext.ExecuteStoreQuery<T>(),它允许您使用{0} {1}语法和对象数组将查询字符串作为参数传递到方法中。这个方法实际上调用了CreateStoreCommand,它将您的查询和对象转换为参数化查询。但SqlQuery似乎并非如此。

仅供参考:

的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65148098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档