С# безболезненный способ вызова хранимых процедур с параметрами?

Я ищу самый простой способ вызова хранимых процедур из С# без явных объектов параметров, например:

используя (DataTable dt=conn.ExecuteQuery("MySP", param1, "param2", p3, p4)) {

При первом вызове библиотека запрашивает у схемы БД сигнатуру SP, а затем кэширует ее для последующих вызовов.

А) Есть ли способ сделать ЭТО ПРОСТО с помощью блока доступа к данным корпоративной библиотеки?

Б) Я не считаю ORM привлекательными из-за проблем синхронизации между схемой и метаданными кода.

Я ДЕЙСТВИТЕЛЬНО нашел эту оболочку без генератора но я надеюсь, что есть крупная библиотека или передовой опыт, который я еще не обнаружил.


person Pete Alvin    schedule 20.11.2013    source источник
comment
Лучшее – это мнение. Пожалуйста, перефразируйте его.   -  person SQLMason    schedule 21.11.2013


Ответы (2)


У меня есть пример 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();
}
....
}
person lordkain    schedule 20.11.2013

щеголеватый?

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 — он очень-очень быстрый.

person Marc Gravell    schedule 20.11.2013