如何使用输出为存储过程创建泛型函数?

时间:2017-04-26 15:42:04

标签: c# asp.net stored-procedures

我创建了一个通用函数来从C#调用存储过程。代码如下所示:

public static void executeStoredProcedure(string SPName, Dictionary<string, object> parameters, string connectionStringName)
{
    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand(SPName, con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            if (parameters != null)
            {
                foreach (KeyValuePair<string, object> kvp in parameters)
                    cmd.Parameters.Add(new SqlParameter(kvp.Key, kvp.Value));
            }
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
        }
    }
}

我使用它时的代码是这样的:

Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("UserId", UserId);
parameters.Add("UserName", UserName);
GlobalClass.executeStoredProcedure("UpdateUserName", parameters, "userDB");

如何修改它以便能够使用具有输出参数的存储过程,并将输出存储在C#变量中?

3 个答案:

答案 0 :(得分:1)

您可以使用SqlParameter数组而不是Dictionary<string, object>。例如

SqlParameter[] parameters = new SqlParameter[] 
{
new SqlParameter() {ParameterName = "@UserId", SqlDbType = SqlDbType.NVarChar, Direction = ParameterDirection.Input, Value= UserId},
new SqlParameter() {ParameterName = "@UserName", SqlDbType = SqlDbType.NVarChar, Direction = ParameterDirection.Input, Value = UserName},
new SqlParameter() {ParameterName = "@OutValue", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Output},
};
GlobalClass.executeStoredProcedure("UpdateUserName", parameters, "userDB");

要在C#变量中存储输出,请使用

int OutVal = Convert.ToInt32(cmd.Parameters["@OutValue"].Value);

您可以将此值作为executeStoredProcedure函数结果返回,或将此值指定给外部变量。

答案 1 :(得分:0)

要获得输出,您必须使用返回方向而不是默认输入方向指定输出参数。

SqlParameter retVal = new SqlParameter("@retVal", SqlDbType.YOURTYPE);
retVal.Direction = ParameterDirection.ReturnValue;

parameters.Add(parm);

//your code
cmd.ExecuteNonQuery();
object val = retVal.Value;
//your code

然后,将bool传递给executeStoredProcedure并返回一个对象或创建一个具有返回值的新方法,并使用bool返回一个值。

答案 2 :(得分:0)

我的方法类似。我曾经使用List返回类型,我得到动态expandoObject的sp结果。当我搜索这个问题时,answer帮助了我。