在C#中编写ASP.NET CRUD应用程序时,我经常发现自己插入了大量重复的样板代码,用于将SQL Server查询提取到数据表中,从查询中获取标量值到变量,调用存储过程等等。
最近,我一直试图通过创建通用类和方法来处理这些基本任务来重构它。但是,为了使它们正常工作,它们需要能够采用任意数量的参数。内置的SqlParameterCollection
类似乎是明显的首选,但不幸的是,这个类无法从用户代码中实例化。下一个选项是将List<SqlParameter>
传递给函数,然后使用foreach
将其内容添加到SqlCommand
的内置参数集合中。这有效,但声明有点笨拙。
要在调用函数之前在代码中创建列表,我必须执行以下操作:
List<SqlParameter> ParameterList = new List<SqlParameter>
{
new SqlParameter() { ParameterName = "@Parameter1", SqlDbType = SqlDbType.VarChar, Value = InputVariable1 },
new SqlParameter() { ParameterName = "@Parameter2", SqlDbType = SqlDbType.VarChar, Value = InputVariable2 },
new SqlParameter() { ParameterName = "@Parameter3", SqlDbType = SqlDbType.VarChar, Value = InputVariable3 }
};
这在较小的显示器上难以阅读,并且仍然包含许多重复的样板。所以我的下一步是使用重载的Add方法创建一个自定义类,这样就不需要这样了。我已经读过在C#中继承List
是不好的,所以我改为使用Collection
:
public class ParameterCollection : Collection<SqlParameter>
{
public void Add(string ParameterName,
SqlDbType ParameterType,
object ParameterValue)
{
// Create the parameter and add it to the list
SqlParameter Parameter = new SqlParameter();
Parameter.ParameterName = ParameterName;
Parameter.SqlDbType = ParameterType;
Parameter.Value = ParameterValue;
base.Add(Parameter);
// Done
return;
}
}
然后我可以声明一个像这样的参数集合:
ParameterCollection Parameters = new ParameterCollection
{
// name type value
{ "@Parameter1", SqlDbType.VarChar, InputVariable1 },
{ "@Parameter2", SqlDbType.VarChar, InputVariable2 },
{ "@Parameter3", SqlDbType.VarChar, InputVariable3 }
};
我的问题是:是否有任何更快/更容易的方式来执行我忽略的任务?我目前的做法是否存在任何隐藏的陷阱或不良做法?
答案 0 :(得分:0)
您可能忽略的一件事是Add
返回添加的参数,这允许我们在同一语句中设置值:
cmd.Parameters.Add("@Parameter1", SqlDbType.VarChar).Value = paramValue;
答案 1 :(得分:0)
而不是实例化和传递集合 - 正如你所说的那样,SqlParameterCollection
没有公共构造函数阻碍 - 你可以通过传递SqlCommand
本身来间接传递集合。然后,您的泛型类和方法可以向SqlCommand.Parameters
添加参数,从而无需实例化单独的集合。