[英]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
,该方法就起作用。
您可以将一个参数传递给该方法,以指示帐户类型是什么,然后使用该参数确定要添加的参数和要省略的参数。
我注意到您为每个值( Account
, Address
等)都有单独的变量,如果将它们放入类中,使用起来可能会更容易
public class ClinicUpdate
{
public string AccountId {get;set;}
public string Address {get;set;}
//etc
}
如果您决定重新排列代码,则可以轻松得多。 例如,您可能决定采用两种方法-一种为一种类型的帐户添加参数,另一种为另一种类型的帐户添加参数。 如果要传递单个对象而不是一大堆参数,那会容易得多。
无论如何,这是个好习惯。 意见不一,但我建议每个方法调用最多四个参数。 如果发现自己将相似的参数列表传递给许多方法,则可能需要为它们提供一个类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.