【发布时间】:2016-11-15 14:31:13
【问题描述】:
我正在创建一个可以从应用程序中的任何位置调用的方法,该方法将接收存储过程的名称和传递给它的参数列表。
在执行此操作时,我遇到了 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;
}
}
}
【问题讨论】:
-
您还应该将参数传递给您的 sp。
-
IMO 你不能同时拥有一个通用方法而不知道调用的 SP 和 类型安全 以避免可能的转换。当然你可以接受一个三元组的数组,比如
params Tuple<string, SqlType, object> parameters。不是最好的呼叫点。您也可以添加一个Action<SqlCommand>您调用的操作,让调用者有机会以他想要的方式添加参数... -
不,拥有这样的方法可能很方便,但它会违反类型安全,除非你将一些责任转移给调用者。当我有这个疑问时,我通常会选择
Action<T>(除非您绑定到特定的数据库引擎,在这种情况下,IEnumerable<SqlParameter>甚至params SqlParameter[]都非常合适跨度> -
或者放弃这种方式,使用轻量级的ORM(例如Dapper)
-
@Steve 但是它具有相同的类型转换问题,因为它不知道底层 SQL 类型 (AFAIK)
标签: c# asp.net sql-server