【发布时间】:2017-07-31 13:12:56
【问题描述】:
public List<PostJobListModel> GetPostsByCompanyId(int id, int s, int d, int p)
{
string command = @"select Id,Title,Cities = STUFF(
(SELECT ',' + City.Name
FROM City where City.Id in (select Id from LocaitonJobRelationship as ljr where ljr.JobId = PostJob.Id)
FOR XML PATH ('')), 1, 1, ''),
Features = STUFF(
(SELECT ',' + Feature.Name
FROM Feature where Feature.Id in (select FeatureId from FeatureJobRelationship as fjr where fjr.JobId = PostJob.Id and (fjr.CategoryId in (@s,@d,@p) ) )FOR XML PATH('')), 1, 1, '')from PostJob where CompanyId = " + id + "";
SqlParameter parameterS = new SqlParameter("@s", s);
SqlParameter parameterD = new SqlParameter("@d", d);
SqlParameter parameterP = new SqlParameter("@p", p);
return _repositoryCustom.FromSql(command, s, d, p).ToList();
}
//存储库
public List<PostJobListModel> FromSql(string sql, params object[] objects)
{
return _context.PostJobListModel.FromSql(sql,objects).ToList();
}
这段代码给出了“SQLException 必须声明标量变量“@variableName”” 我如何创建安全命令字符串?
编辑答案return _repositoryCustom.FromSql(command, parameterS , parameterD , parameterP ).ToList();
【问题讨论】:
-
调用
FromSql时没有包含参数。如果只调用EF FromSql,使用SqlCommand的目的是什么? -
用于自定义 sql 查询。调用时如何包含参数?
-
要么需要使用带参数的SqlCommand对象来执行语句,要么使用纯文本字符串调用
.FromSql()。您混合了这两种方法,这就是您的参数消失的原因。添加参数不会像string.Parse那样修改.CommandText。我还建议您将所有变量作为参数传递到您的命令中。将它们推送到字符串的中间会使您面临潜在的 SQL 注入攻击。 -
@AndrewS 谢谢你的评论,你能给我一个不只是安全的示例代码吗?
-
@AndrewS
FromSql()也接受参数,你只需要传入。
标签: .net entity-framework asp.net-core .net-core