我试图在一个单独的类中重构我的存储过程方法。这很棒,因为它将我的方法(在主类中)减少到仅几行代码。所有连接字符串和存储过程(我称它们为模板)都将存储在名为ConnClass的类中。我遇到的问题是编写一种接受多个参数的方法-但如果需要只能使用一个参数,如果需要则可以使用多个参数。这是我用于一个参数的方法:
public bool ExecuteProcedure1Paramater(string Proc, string AccountNumber)
{
int j = 0;
try
{
using (cmd = new SqlCommand(Proc, con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(sp.AccountNumberParam, AccountNumber);
con.Open();
j = cmd.ExecuteNonQuery();
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
sda.Fill(dt);
}
con.Close();
}
}
catch (Exception ex)
{
// Log Exceptions
}
if (j > 0)
return true;
else
return false;
}
这是我主类中的一种方法,该方法打开连接并传递存储过程的名称和参数值等,并填充一个下拉列表。
public void GetAccounts()
{
//This procedure gets the parent account number along with other accounts associated with the parent account and places them in a DDL.
//Arguments: Stored Procedure | Paramater
ConnC.ExecuteProcedure1Paramater(sp.GetAccounts, txtAccountNumber.Value);
cmbAccountNumbers.DataSource = ConnC.dt;
cmbAccountNumbers.DataTextField = sp.MergedAccounts;
cmbAccountNumbers.DataValueField = sp.MergedAccounts;
cmbAccountNumbers.DataBind();
cmbAccountNumbers.AppendDataBoundItems = false;
}
如果我想传递多个参数,则必须复制上面的代码(第一个示例),并将其命名为ExecuteProcedure2Paramater,ExecuteProcedure3Paramater,依此类推-为每个方法添加多个参数。然后在我的主类中,我将选择该特定方法所需的任何模板(第二个代码示例)。这似乎是很多废话,但是我将在以后的所有应用程序中使用相同的想法。是否有更好的建议和更好的方法来传递不同数量的参数,而不必创建太多参数(模板)?
答案 0 :(得分:0)
创建一个结构来保存变量及其名称和值的属性,例如
public class Variable
{
public string Name { get; set; }
public string Value { get; set; }
}
然后拨打所有电话,例如:
public string CallSproc(string sprocName, params Variable[] variables)
{
...
variables.ToList()
.ForEach(param => cmd.Parameters.AddWithValue(param.Name, param.Value);
...
}
答案 1 :(得分:0)
你可以这样使用:
public xxx yyyyy(string value1, string value2, string value3, string value4)
{
SqlParameter[] sqlParameters = {
new SqlParameter("@param1", value1),
new SqlParameter("@param2", value2),
new SqlParameter("@param3", value3),
new SqlParameter("@param4", value4)
};
bool res = ExecuteProcedure("proc_1", sqlParameters);
// ... do something
}
public bool ExecuteProcedure(string Proc, SqlParameter[] sqlParameters)
{
int j = 0;
try
{
using (cmd = new SqlCommand(Proc, con))
{
cmd.CommandType = CommandType.StoredProcedure;
//here the params are added
cmd.Parameters.AddRange(sqlParameters);
con.Open();
j = cmd.ExecuteNonQuery();
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
sda.Fill(dt);
}
con.Close();
}
}
catch (Exception ex)
{
// Log Exceptions
}
if (j > 0)
return true;
else
return false;
}