有没有办法检查参数是否在存储过程中?

时间:2012-02-02 17:26:11

标签: c# asp.net stored-procedures

我正在编写一个通用函数,用于将查询字符串直接输入到sproc中。该算法相当基本 - 循环查询键,将它们用作参数名称,而值用作参数值。所以它看起来像这样:

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

到目前为止这个工作正常,除了当然所有查询键必须匹配sproc的参数,如果它们不是我得到类似

的SQL异常
@someParameter is not a parameter for procedure some_sproc

但是我需要能够在查询字符串中传入不会传递给sproc的变量,所以我需要一种方法来“忽略”它们。

有没有办法测试给定的存储过程是否需要某个参数?所以我可以沿着这些方向做点什么

if (paramExists("@" + key, "some_sproc") && int.TryParse(req[key], out tryInt)) 
{
    p = new SqlParameter("@" + key, SqlDbType.Int);
    p.Value = tryInt;
    pars.Add(p);
}

3 个答案:

答案 0 :(得分:5)

您可以使用SqlCommandBuilder获取SP参数:

using (SqlConnection sqlConn = new SqlConnection(yourConnStr))
using (SqlCommand sqlCmd = new SqlCommand(yourProcedureName, sqlConn))
{
    sqlConn.Open();
    sqlCmd.CommandType = CommandType.StoredProcedure;
    SqlCommandBuilder.DeriveParameters(sqlCmd);
    // now you can check parameters in sqlCmd.Parameters
}

更多详情here

答案 1 :(得分:4)

您可以查询ANSI information_schema.parameters视图,它返回所有参数及其位置

SELECT parameter_name, ordinal_position FROM INFORMATION_SCHEMA.parameters
WHERE SPECIFIC_NAME = 'some_sproc'

答案 2 :(得分:0)

大多数DB存储“元数据”,例如可访问系统表/视图中的存储过程的结构。如果您正在使用MSS,我会查看sys.procedures和sys.parameters;加入这两个视图并按过程名称过滤。