我有一个具有许多参数的存储过程,并且我一直使用以下内容来返回结果:
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();有什么不同?如果我切换到他的系统,我需要注意什么
发布于 2020-12-13 01:33:16
我觉得你的方法更安全。但是,如果您想让它更简单,您可以参考这个article,您不必初始化SqlParameter实例,但是@p1 @p2语法仍然是必不可少的。在文章的第一部分,它也提到了应该注意这一点。
AFAIK,SqlQuery不会阻止SQL注入,这意味着如果我将DROP命令传递到您的第二个示例中,该表可能会被永久删除。因此,前辈写的可能会暴露出潜在的安全风险,你应该确保你的查询中的参数使用正确的方式,以防止此类攻击。
关于第二个示例,请考虑使用ObjectContext.ExecuteStoreQuery<T>(),它允许您使用{0} {1}语法和对象数组将查询字符串作为参数传递到方法中。这个方法实际上调用了CreateStoreCommand,它将您的查询和对象转换为参数化查询。但SqlQuery似乎并非如此。
仅供参考:
的代码。
https://stackoverflow.com/questions/65148098
复制相似问题