将0-n参数传递给SQL存储过程执行器方法

时间:2016-11-15 14:31:14

标签: c# asp.net sql-server

我正在创建一个方法,可以从我的应用程序中的任何位置调用,该方法将接受存储过程的命名和传递给它的参数列表。

在执行此操作时,我遇到了Parameters.AddWithValue命令,但也遇到了博客帖子和一些SO帖子,说这是由于转换问题而导致的。他们都建议使用

添加参数
Parameters.Add(PARAMETER, SqlDbType.TYPE);

但问题是,如果我有一个类似我的方法,当我不知道参数是什么类型时,我如何正确使用Parameters.Add方法?有什么好方法可以解决这个问题,或者我是否过于偏执,应该坚持使用Parameters.AddWithValue

这里的参考是我现在尝试更新的基本方法,因此它可以处理参数

public static DataTable ExecuteDynamicsStoredProc(string procedureName)
{
    var dataTable = new DataTable();

    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DynamicsDB"].ToString()))
    {
        using (var command = new SqlCommand("c2s_ProjectPerformanceReport", connection))
        {
            connection.Open();
            command.CommandType = CommandType.StoredProcedure;

            var dataAdapter = new SqlDataAdapter();
            dataAdapter.SelectCommand = command;

            dataAdapter.Fill(dataTable);

            return dataTable;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以让该方法接受SqlParameter[]并使用command.Parameters.AddRange()

public static DataTable ExecuteDynamicsStoredProc(string procedureName, SqlParameter[] args) {
    var dataTable = new DataTable();

    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DynamicsDB"].ToString())) {
        using (var command = new SqlCommand(procedureName, connection)) { //use passed in proc name
            connection.Open();
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddRange(args); //add all the parameters
            var dataAdapter = new SqlDataAdapter();
            dataAdapter.SelectCommand = command;
            dataAdapter.Fill(dataTable);
            return dataTable;
        }
    }
}

public static void ExecuteProcOne(string name, int age, bool alive) {            
    SqlParameter p1 = new SqlParameter("name", name);
    SqlParameter p2 = new SqlParameter("age", age);
    SqlParameter p3 = new SqlParameter("alive", alive);

    var result = ExecuteDynamicsStoredProc("ExecuteProcOne", new SqlParameter[] { p1, p2, p3 });
}

使用ExecuteProcOne()之类的方法来处理具有各自数据类型的各个过程。您可以进一步提取此方法以使方法返回SqlParameter[]

通过这种方式,您只需拨打MyProcName即可知道智能感应需要哪些参数。