我正在寫查詢字符串直接放入存儲區的通用函數。該算法非常基本 - 通過查詢鍵循環,將它們用作參數名稱,同時將該值用作參數值。因此,它看起來就像是這樣的:有沒有辦法檢查參數是否在存儲過程中?
ArrayList pars = new ArrayList();
SqlParameter p;
int tryInt;
for (int i = 0; i < req.QueryString.Count; i++)
{
key = req.QueryString.AllKeys[i];
if (int.TryParse(req[key], out tryInt))
{
p = new SqlParameter("@" + key, SqlDbType.Int);
p.Value = tryInt;
pars.Add(p);
}
}
這工作得很好,到目前爲止,除了當然的所有查詢鍵必須爲存儲過程的參數相匹配,如果他們不,我得到一個SQL例外又說什麼
@someParameter is not a parameter for procedure some_sproc
但我需要能夠傳遞查詢字符串中的變量不會傳遞到存儲過程,所以我需要一種方法來「忽略」它們。
有沒有辦法來測試一個給定的存儲過程是否需要某個參數?所以,我可以沿着這些路線
if (paramExists("@" + key, "some_sproc") && int.TryParse(req[key], out tryInt))
{
p = new SqlParameter("@" + key, SqlDbType.Int);
p.Value = tryInt;
pars.Add(p);
}
雖然我得到了我所需要的答案,我意識到我不想再拍DB調用。相反,我現在做的是,任何查詢變量,我想作爲一個參數傳遞給我在開始時使用@符號的名稱。因此,例如像這樣的查詢file.aspx?sproc=somesproc&@par1=param1&par2=param2將通過@ par1 sproc但不是par2 – ilia 2012-02-02 19:35:15