【问题标题】: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&lt;SomeType&gt;,它会为您填充一个对象模型。当绑定到一个对象模型时,它包括你可能期望人们对性能有强迫症的所有元编程/缓存。提示:我通常使用通用 API - 它非常非常快。

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2013-06-24
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多