繁体   English   中英

将 SQL 参数集合传递给函数

[英]Passing a SQL parameter collection to a function

在用 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 }
};

我的问题是:有没有更快/更简单的方法来执行我忽略的这项任务? 我目前的做法是否有任何潜在的隐藏陷阱或不良做法?

您可能忽略的一件事是Add返回Add的参数,这允许我们在同一语句中设置值:

cmd.Parameters.Add("@Parameter1", SqlDbType.VarChar).Value = paramValue;

而不是实例化和传递集合 - 正如你所说,它受到没有公共构造函数的SqlParameterCollection阻碍 - 你可以通过传递SqlCommand本身来间接传递集合。 然后,您的泛型类和方法可以向SqlCommand.Parameters添加参数,从而无需实例化单独的集合。

有几种方法可以执行此操作。

首先:您必须声明新参数。

cmd.Parameters.Add("@Parameter1", SqlDbType.VarChar, 50 //the size of Varchar);

然后添加值。

cmd.Parameters["@Parameter1"].Value = paramValue;

我更喜欢使用 Dapper 扩展来处理这些事情。 它更容易,语法更具可读性,总的来说就是喜欢它。 检查链接,您可能会喜欢您所看到的: https ://dapper-tutorial.net/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM