【问题标题】:C# "painless" way to call stored procedures with parameters?C#“无痛”方式调用带参数的存储过程?
【发布时间】:2013-11-20 20:19:35
【问题描述】:
我正在寻找从 C# 调用存储过程的最简单方法,无需显式参数对象,如下所示:
使用 (DataTable dt=conn.ExecuteQuery("MySP", param1, "param2", p3, p4)) {
在第一次调用时,库会查询数据库架构以获取 SP 签名,然后将其缓存以供后续调用。
A) 有什么方法可以用企业图书馆数据访问块简单地做到这一点?
B) 由于架构和代码元数据之间的同步问题,我不觉得 ORM 具有吸引力。
我确实找到了这个generator-less wrapper,但我希望有一个我还没有发现的主要库或最佳实践。
【问题讨论】:
标签:
c#
entity-framework
stored-procedures
enterprise-library
system.data
【解决方案1】:
我确实有一个函数调用所在的 SqlDataReader 示例
ExecuteNonQuery("dbo.[Sp_Skp_UpdateFuncties]", parameters);
这是在保存数据库连接字符串的 DataBaseManager 类中
public classDataBaseManager
{
...
public int ExecuteStoredProcedure(string storedprocedureNaam, IEnumerable<KeyValuePair<string, object>> parameters)
{
var sqlCommand = new SqlCommand
{
Connection = DatabaseConnectie.SqlConnection,
CommandType = CommandType.StoredProcedure,
CommandText = storedprocedureNaam,
};
foreach (KeyValuePair<string, object> keyValuePair in parameters)
{
sqlCommand.Parameters.Add(
new SqlParameter { ParameterName = "@" + keyValuePair.Key, Value = keyValuePair.Value ?? DBNull.Value }
);
}
if (sqlCommand == null)
throw new KoppelingException("Stored procedure ({0}) aanroepen lukt niet", storedprocedureNaam);
return sqlCommand.ExecuteNonQuery();
}
....
}
【解决方案2】:
小巧玲珑?
var rows = conn.Query("procname",
new { name = "abc", id = 123 }, // <=== args, fully named and typed
commandType: CommandType.StoredProcedure
).ToList();
以上是允许自动绑定到列名的动态 API:
foreach(var row in rows) {
int x = row.X; // look ma, no column mappings
string y = row.Y;
//...
}
但您也可以使用Query<SomeType>,它会为您填充一个对象模型。当绑定到一个对象模型时,它包括你可能期望人们对性能有强迫症的所有元编程/缓存。提示:我通常使用通用 API - 它非常非常快。