簡體   English   中英

存儲過程中的可選參數

[英]optional parameters in stored procedure

我正在使用mvc構建網站,並希望使用包含一組參數的存儲過程來保存一些數據。 我想知道是否可以將其中一些參數設置為可選參數。 原因是發送回的數據取決於帳戶類型。 如果用戶編輯帳戶類型1,則必須將所有參數發送回;如果他們編輯帳戶類型2,則僅將3參數發送回。

sql參數:

alter PROCEDURE web.Maint_UpdateClinic
       @AccountID INT
       ,@IsActive BIT = 1
       ,@AccountName VARCHAR(100) = NULL
       ,@AccountAddress VARCHAR(100) = NULL
       ,@City VARCHAR(100) = NULL
       ,@State VARCHAR(2) = NULL
       ,@ZipCode VARCHAR(10) = NULL
       ,@PhoneNumber VARCHAR(20) = NULL
       ,@WebID INT

控制器調用過程中的操作:

using (OdbcConnection _conn = new OdbcConnection("FILEDSN=c:\\datasources\\RxCard.dsn"))
            using (OdbcCommand cmd1 = new OdbcCommand())
            {
                cmd1.Connection = _conn;
                cmd1.CommandText = "{call web.Maint_UpdateClinic(?,?,?,?,?,?,?,?,?)}";
                cmd1.Parameters.AddWithValue("@AccountID", AccountID);
                cmd1.Parameters.AddWithValue("@IsActive", true);
                cmd1.Parameters.AddWithValue("@AccountName", AccountName);
                cmd1.Parameters.AddWithValue("@Address", Address);
                cmd1.Parameters.AddWithValue("@City", City);
                cmd1.Parameters.AddWithValue("@State", State);
                cmd1.Parameters.AddWithValue("@ZipCode", ZipCode);
                cmd1.Parameters.AddWithValue("@PhoneNumber", PhoneNumber);
                cmd1.Parameters.AddWithValue("@WebID", CookieStore.GetCookie("WebId"));            
                cmd1.CommandType = CommandType.StoredProcedure;
                _conn.Open();
                cmd1.ExecuteNonQuery();
                _conn.Close();
            }

如果參數在存儲過程中是可選的,則可以選擇是否添加它們。 例如,如果您刪除此行(上方)

cmd1.Parameters.AddWithValue("@AccountName", AccountName);

然后存儲過程將使用默認值@AccountName

這意味着您只需要一種確定是否傳遞每個參數的方法。 如何做到這一點很難回答,因為這取決於應用程序的行為。

例如,您可以這樣做:

if(AccountName != null)
    cmd1.Parameters.AddWithValue("@AccountName", AccountName);

換句話說,如果沒有為AccountName提供值,則不要將其發送給過程。 只要您不需要使用此方法將AccountName設置為null ,該方法就起作用。

您可以將一個參數傳遞給該方法,以指示帳戶類型是什么,然后使用該參數確定要添加的參數和要省略的參數。

我注意到您為每個值( AccountAddress等)都有單獨的變量,如果將它們放入類中,使用起來可能會更容易

public class ClinicUpdate
{
    public string AccountId {get;set;}
    public string Address {get;set;}
    //etc
}

如果您決定重新排列代碼,則可以輕松得多。 例如,您可能決定采用兩種方法-一種為一種類型的帳戶添加參數,另一種為另一種類型的帳戶添加參數。 如果要傳遞單個對象而不是一大堆參數,那會容易得多。
無論如何,這是個好習慣。 意見不一,但我建議每個方法調用最多四個參數。 如果發現自己將相似的參數列表傳遞給許多方法,則可能需要為它們提供一個類。

暫無
暫無

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

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