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



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

在这样做的时候,我遇到了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;
        }
    }
}

您可以使该方法接受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,你就知道你需要智能感知的参数了

最新更新