【发布时间】:2014-10-26 00:26:51
【问题描述】:
在用 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 }
};
我的问题是:是否有任何更快/更容易的方法来执行我忽略的这项任务?我目前的做法是否存在任何潜在的隐藏陷阱或不良做法?
【问题讨论】:
-
我认为 Visual Studio 会为您自动完成大部分此类操作。
-
Parameters.Add有一堆我通常使用的重载。无论如何,如果我希望缩短“创建”SqlParameter 的时间,我可能会创建一个辅助函数(带有重载/默认值),而不是创建一个类。 -
这应该在CodeReview。不能不用实体框架吗?
-
@meda:请阅读Can we stop using AddWithValue() already? - 我会不推荐
AddWithValue而不是其他选项。 -
@marc_s 有趣的文章 我必须同意明确总是更好。感谢分享!
标签: c# sql asp.net sql-server