Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将SQL参数集合传递给函数_C#_Sql_Asp.net_Sql Server - Fatal编程技术网

C# 将SQL参数集合传递给函数

C# 将SQL参数集合传递给函数,c#,sql,asp.net,sql-server,C#,Sql,Asp.net,Sql Server,在用C#编写ASP.NET CRUD应用程序时,我经常会插入大量重复的样板代码,用于将SQL Server查询提取到数据表中、将查询中的标量值提取到变量中、调用存储过程等等 最近,我一直试图通过创建泛型类和方法来处理这些基本任务来重构它。然而,为了使这些能够正常工作,它们需要能够接受任意数量的参数。内置的SqlParameterCollection类显然是首选,但不幸的是,这个类无法从用户代码实例化。下一个选项是将列表传递给函数,然后使用foreach将其内容添加到SqlCommand的内置参数

在用C#编写ASP.NET CRUD应用程序时,我经常会插入大量重复的样板代码,用于将SQL Server查询提取到数据表中、将查询中的标量值提取到变量中、调用存储过程等等

最近,我一直试图通过创建泛型类和方法来处理这些基本任务来重构它。然而,为了使这些能够正常工作,它们需要能够接受任意数量的参数。内置的
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
行非常相似的助手。