C# 如何保护我的查询:我得到的SqlParameter已包含在另一个SqlParameterCollection中
我正在尝试参数化所有查询,以满足VisualStudio中PUMA漏洞扫描扩展的SQL注入结果。在执行此操作时,我遇到了标题中的错误: SqlParameter已包含在另一个SqlParameterCollection中 这是相关代码(第二行生成错误):C# 如何保护我的查询:我得到的SqlParameter已包含在另一个SqlParameterCollection中,c#,dbcontext,sqlparameter,C#,Dbcontext,Sqlparameter,我正在尝试参数化所有查询,以满足VisualStudio中PUMA漏洞扫描扩展的SQL注入结果。在执行此操作时,我遇到了标题中的错误: SqlParameter已包含在另一个SqlParameterCollection中 这是相关代码(第二行生成错误): IEnumerable docLst=prfDao.GetUploadedDocLog(Convert.ToInt32(id)); 如果(docLst.Count()>0){/这是因为IEnumerable返回。当调用docLst.Count(
IEnumerable docLst=prfDao.GetUploadedDocLog(Convert.ToInt32(id));
如果(docLst.Count()>0){/这是因为IEnumerable
返回。当调用docLst.Count()
时,它会再次尝试执行-不同的执行
尝试返回列表
MSDN:创建此对象时不会执行查询;每次枚举时都会执行查询,例如使用foreach
显然,它试图重用添加到另一个集合中的参数(以前的执行)您没有显示任何实际涉及SqlParameter
的代码。是的,我显示了。它在我的示例中的最后一行代码中。我假设它在抱怨转换短语缩减为的内容,这意味着在此上下文中tickID解析为的内容只能由一个查询使用。通常我们会看到.Clear()
在重用(或创建一组新的参数,但我不完全理解这段代码)之前,是否在这些东西上使用(这就是为什么这不是答案。)这完全取决于SqlQuery()的内容
does.T.S.我修复了它。我简化了这篇文章的查询文本,真正的查询要长得多,并且使用了StringBuilder,我无意中在上传的文本中留下了一个引用。再次感谢,这正是我需要知道的。我已经测试过它,它在作为列表返回时可以工作。没有问题。始终小心使用IEnumerable
因为它将您带入不同执行的领域。而且DbRawSqlQuery
也是如此
IEnumerable<UploadedDocsClass> docLst = prfDao.GetUploadedDocLog(Convert.ToInt32(id));
if (docLst.Count() > 0){ //<-- this is where the error is thrown
...
}
public IEnumerable<UploadedDocsClass> GetUploadedDocLog(int tickId)
{
string s = "SELECT * FROM MyTable WHERE [request_id] = @tickId ";
MyDataBaseContext accCon = new MyDataBaseContext();
return accCon.Database.SqlQuery<UploadedDocsClass>(s, new SqlParameter("@tickId", Convert.ToString(tickId)));
}