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

  • 本文关键字:参数 方法 过程 单独 存储 重构 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等 - 为每种方法添加多个参数。然后,在我的主要类中,我将选择该特定方法所需的任何模板(第二代码示例(。这似乎是很多胡说八道的编码,但是我将在所有应用程序中使用相同的想法。是否有更好的建议和更好的方法来传递不同数量的参数,而无需创建这么多(模板(?

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

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

您可以使用类似的东西:

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
    }
    return j > 0;
}

最新更新