C# 将SQL参数集合传递给函数
在用C#编写ASP.NET CRUD应用程序时,我经常会插入大量重复的样板代码,用于将SQL Server查询提取到数据表中、将查询中的标量值提取到变量中、调用存储过程等等 最近,我一直试图通过创建泛型类和方法来处理这些基本任务来重构它。然而,为了使这些能够正常工作,它们需要能够接受任意数量的参数。内置的C# 将SQL参数集合传递给函数,c#,sql,asp.net,sql-server,C#,Sql,Asp.net,Sql Server,在用C#编写ASP.NET CRUD应用程序时,我经常会插入大量重复的样板代码,用于将SQL Server查询提取到数据表中、将查询中的标量值提取到变量中、调用存储过程等等 最近,我一直试图通过创建泛型类和方法来处理这些基本任务来重构它。然而,为了使这些能够正常工作,它们需要能够接受任意数量的参数。内置的SqlParameterCollection类显然是首选,但不幸的是,这个类无法从用户代码实例化。下一个选项是将列表传递给函数,然后使用foreach将其内容添加到SqlCommand的内置参数
SqlParameterCollection
类显然是首选,但不幸的是,这个类无法从用户代码实例化。下一个选项是将列表
传递给函数,然后使用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 }
};
ParameterCollection Parameters = new ParameterCollection
{
// name type value
{ "@Parameter1", SqlDbType.VarChar, InputVariable1 },
{ "@Parameter2", SqlDbType.VarChar, InputVariable2 },
{ "@Parameter3", SqlDbType.VarChar, InputVariable3 }
};
然后,我可以声明如下参数集合:
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 }
};
ParameterCollection Parameters = new ParameterCollection
{
// name type value
{ "@Parameter1", SqlDbType.VarChar, InputVariable1 },
{ "@Parameter2", SqlDbType.VarChar, InputVariable2 },
{ "@Parameter3", SqlDbType.VarChar, InputVariable3 }
};
我的问题是:有没有更快捷/更容易的方法来完成我忽略的任务?我目前的做法中是否存在潜在的隐藏陷阱或不良做法?您可能忽略的一点是,
Add
返回添加的参数,该参数允许我们在同一语句中设置值:
cmd.Parameters.Add("@Parameter1", SqlDbType.VarChar).Value = paramValue;
您可以通过传递
SqlCommand
本身来间接传递集合,而不是实例化和传递一个集合(正如您所说,SqlParameterCollection
没有公共构造函数会妨碍该集合)。然后,您的泛型类和方法可以将参数添加到SqlCommand.parameters
,这样您就不需要实例化单独的集合了。我以为Visual Studio为您自动化了大部分此类操作。parameters.add
具有一系列我通常使用的重载。无论如何,如果我希望缩短“创建”SqlParameter的时间,我可能会创建一个帮助函数(带有重载/默认值),而不是创建一个类。这可能应该是启用的。你不能使用实体框架吗?@meda:请阅读-与其他选项相比,我不建议使用AddWithValue
。@marc_有趣的文章我不得不同意,显式总是更好的。谢谢分享!我以前见过这样的语法,但当我尝试它时,它不起作用。如果我执行类似List参数List=newlist()的操作;ParameterList.Add(新的SqlParameter(“@Parameter1”,SqlDbType.VarChar)).Value=InputVariable1;它会导致错误(运算符“.”不能应用于void类型的操作数)。@JDG1980注释中的示例不起作用的原因是List.Add
。和一些SqlParameterCollection.Add
重载。但是我展示的重载(最有用的一个?),您可能希望将其纳入您的思考中。如前所述,SqlParameterCollection
的问题是它不能从用户代码实例化,因此不能传递给函数。我试图摆脱使用SqlConnection(…){…使用SqlCommand(…)…}的几十个多缩进代码>块散落在我的代码中。@JDG1980是的,我确实看到了你关于不能实例化SqlParameterCollection
,,但我的一部分观点是,可以简化Add
行,让您可以按原样使用它,而不是创建一个调用与此Add
行非常相似的助手。