我正在创建一个方法,可以从我的应用程序中的任何位置调用,该方法将接受存储过程的命名和传递给它的参数列表。
在执行此操作时,我遇到了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;
}
}
}
答案 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
即可知道智能感应需要哪些参数。