我正在写查询字符串直接放入存储区的通用函数。该算法非常基本 - 通过查询键循环,将它们用作参数名称,同时将该值用作参数值。因此,它看起来就像是这样的:有没有办法检查参数是否在存储过程中?
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