我正在使用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();
}
答案 0 :(得分:1)
如果参数在存储过程中是可选的,则可以选择是否添加它们。例如,如果删除此行(上图)
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
}
如果您决定重新安排代码,那么这可以让您更轻松。例如,您可能决定制作两个方法 - 一个为一种帐户添加参数,另一种为另一种类型添加参数。如果你传递一个对象而不是一大堆参数,那就容易多了 无论如何,这是一个很好的做法。意见各不相同,但我建议每个方法调用最多四个参数。如果你发现自己将一个类似的参数列表传递给许多方法,那么你可能需要一个类。