2017-09-25 40 views
2

我試圖參數化所有查詢以滿足來自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

回答

1

這是因爲IEnumerable<UploadedDocsClass>返回。它試圖再次執行時調用docLst.Count() - 遞延執行

,請返回List<T>

MSDN:創建該對象時不執行查詢;每次枚舉時都會執行它,例如使用foreach。

顯然,它正試圖重新使用被添加到其他集合(以前執行)

+0

再次感謝,這正是我需要知道的。我已經測試過它,並且將它作爲列表返回時工作。列表 cheluto2

+0

沒有問題LEM。 「IEnumerable」總是要小心,因爲它會讓你進入不同執行的領域。 'DbRawSqlQuery '也一樣 –

相關問題