繁体   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