如何保护我的查询:我得到SqlParameter已被另一个SqlParameterCollection包含

问题描述:

我试图参数化所有查询以满足来自Visual Studio中的PUMA漏洞扫描扩展的SQL注入发现。虽然这样做,我运行到错误的标题:如何保护我的查询:我得到SqlParameter已被另一个SqlParameterCollection包含

SqlParameter有已被另一SqlParameterCollection

这是相关的代码包含(第二行生成错误):

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))); 
} 

我在这里和谷歌搜索,似乎无法找到解决我的具体情况。我尝试过克隆参数,特别声明它,并在使用它之后将它设置为null,然后在使用它之前将它放入一个集合中,我甚至尝试在参数名称末尾添加一个随机数,这样每次都会有所不同,但没有什么,同样的错误。

如何在查询中仍然使用参数时解决这个问题?

感谢

+1

您还没有显示,实际上涉及'SqlParameter'任何代码参数。 – SLaks

+0

是的,我有。它在我的示例代码的最后一行。 – cheluto2

+0

我假设它抱怨的是转换短语减少到的任何内容,这意味着无论在这种情况下解决的tickID只能由一个查询使用。通常我们会在重用之前看到'.Clear()'被用于这样的事情(或者创建一组新的参数,但是我没有完全理解这段代码(这就是为什么这不是答案)。 – jdv

这是因为IEnumerable<UploadedDocsClass>返回。它试图再次执行时调用docLst.Count() - 递延执行

,请返回List<T>

MSDN:创建该对象时不执行查询;每次枚举时都会执行它,例如使用foreach。

显然,它正试图重新使用被添加到其他集合(以前执行)

+0

再次感谢,这正是我需要知道的。我已经测试过它,并且将它作为列表返回时工作。列表 cheluto2

+0

没有问题LEM。 “IEnumerable”总是要小心,因为它会让你进入不同执行的领域。 'DbRawSqlQuery '也一样 –