在一个接受不同数量参数的单独类中重构存储过程方法

时间:2019-06-28 16:35:09

标签: c#

我试图在一个单独的类中重构我的存储过程方法。这很棒,因为它将我的方法(在主类中)减少到仅几行代码。所有连接字符串和存储过程(我称它们为模板)都将存储在名为ConnClass的类中。我遇到的问题是编写一种接受多个参数的方法-但如果需要只能使用一个参数,如果需要则可以使用多个参数。这是我用于一个参数的方法:

public bool ExecuteProcedure1Paramater(string Proc, string AccountNumber)
{
    int j = 0;
    try
    {
        using (cmd = new SqlCommand(Proc, con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue(sp.AccountNumberParam, AccountNumber);
            con.Open();
            j = cmd.ExecuteNonQuery();
            using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
            {
                sda.Fill(dt);
            }
            con.Close();
        }
    }
    catch (Exception ex)
    {
        // Log Exceptions
    }

    if (j > 0)
        return true;
    else
        return false;
}

这是我主类中的一种方法,该方法打开连接并传递存储过程的名称和参数值等,并填充一个下拉列表。

public void GetAccounts()
{
        //This procedure gets the parent account number along with other accounts associated with the parent account and places them in a DDL.
        //Arguments: Stored Procedure | Paramater
        ConnC.ExecuteProcedure1Paramater(sp.GetAccounts, txtAccountNumber.Value);
        cmbAccountNumbers.DataSource = ConnC.dt;
        cmbAccountNumbers.DataTextField = sp.MergedAccounts;
        cmbAccountNumbers.DataValueField = sp.MergedAccounts;
        cmbAccountNumbers.DataBind();
        cmbAccountNumbers.AppendDataBoundItems = false;
}

如果我想传递多个参数,则必须复制上面的代码(第一个示例),并将其命名为ExecuteProcedure2Paramater,ExecuteProcedure3Paramater,依此类推-为每个方法添加多个参数。然后在我的主类中,我将选择该特定方法所需的任何模板(第二个代码示例)。这似乎是很多废话,但是我将在以后的所有应用程序中使用相同的想法。是否有更好的建议和更好的方法来传递不同数量的参数,而不必创建太多参数(模板)?

2 个答案:

答案 0 :(得分:0)

创建一个结构来保存变量及其名称和值的属性,例如

public class Variable
{
    public string Name { get; set; }
    public string Value { get; set; }
}

然后拨打所有电话,例如:

public string CallSproc(string sprocName, params Variable[] variables)
{

...
    variables.ToList()
             .ForEach(param =>  cmd.Parameters.AddWithValue(param.Name, param.Value);
...

}

答案 1 :(得分:0)

你可以这样使用:

public xxx yyyyy(string value1, string value2, string value3, string value4)
{
    SqlParameter[] sqlParameters = {
                new SqlParameter("@param1", value1),
                new SqlParameter("@param2", value2),
                new SqlParameter("@param3", value3),
                new SqlParameter("@param4", value4)
            };
    bool res = ExecuteProcedure("proc_1", sqlParameters);
    // ... do something
}
public bool ExecuteProcedure(string Proc, SqlParameter[] sqlParameters)
{
    int j = 0;
    try
    {
        using (cmd = new SqlCommand(Proc, con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            //here the params are added
            cmd.Parameters.AddRange(sqlParameters);

            con.Open();
            j = cmd.ExecuteNonQuery();
            using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
            {
                sda.Fill(dt);
            }
            con.Close();
        }
    }
    catch (Exception ex)
    {
        // Log Exceptions
    }

    if (j > 0)
        return true;
    else
        return false;
}