簡體   English   中英

在接受不同數量參數的單獨類中重構存儲過程方法

[英]Refactor stored procedure method in a separate class that accepts a varying number of parameters

我正在嘗試在一個單獨的類中重構我的存儲過程方法。 這很棒,因為它將我的方法(在主類中)減少到只有幾行代碼。 所有連接字符串和存儲過程(我稱它們為模板)都將存儲在一個名為 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM