向SQL存储过程执行器方法传递0-n个参数
本文关键字:0-n 参数 方法 SQL 存储过程 执行 | 更新日期: 2023-09-27 18:17:57
我正在创建一个可以从应用程序中的任何地方调用的方法,该方法将接受存储过程的名称和要传递给它的参数列表。
在这样做的时候,我遇到了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
,你就知道你需要智能感知的参数了