存储过程中的可选参数

时间:2016-07-15 22:52:50

标签: c# sql-server stored-procedures

我正在使用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();
            }

1 个答案:

答案 0 :(得分:1)

如果参数在存储过程中是可选的,则可以选择是否添加它们。例如,如果删除此行(上图)

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
}

如果您决定重新安排代码,那么这可以让您更轻松。例如,您可能决定制作两个方法 - 一个为一种帐户添加参数,另一种为另一种类型添加参数。如果你传递一个对象而不是一大堆参数,那就容易多了 无论如何,这是一个很好的做法。意见各不相同,但我建议每个方法调用最多四个参数。如果你发现自己将一个类似的参数列表传递给许多方法,那么你可能需要一个类。