2

我正在寻找在没有显式参数对象的情况下从 C# 调用存储过程的绝对最简单的方法,如下所示:

使用 (DataTable dt=conn.ExecuteQuery("MySP", param1, "param2", p3, p4)) {

在第一次调用时,库会查询数据库模式以获取 SP 签名,然后将其缓存以供后续调用。

A) 有什么办法可以用企业图书馆数据访问块简单地做到这一点?

B) 由于模式和代码元数据之间的同步问题,我不觉得 ORM 有吸引力。

我确实找到了这个无生成器的包装器,但我希望有一个我还没有发现的主要库或最佳实践。

4

2 回答 2

1

小巧玲珑?

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 - 它非常非常快。

于 2013-11-20T20:57:04.573 回答
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();
}
....
}
于 2013-11-20T21:00:34.460 回答