Подтвердить что ты не робот

Использование Dapper.TVP TableValueParameter с другими параметрами

У меня есть процедура, которая принимает параметр table-value, а также другие:

CREATE PROCEDURE [dbo].[Update_Records]
    @currentYear INT,
    @country INT,
    @records Record_Table_Type READONLY
AS

и пытаюсь называть это с помощью Dapper.TVP.

Вот код, который у меня есть до сих пор:

        var recordsParameter = new List<SqlDataRecord>();

        // This metadata matches 'Record_Table_Type' in the Database
        var recordsMetaData = new[]
        {
            new SqlMetaData("OriginalValue", SqlDbType.Decimal, 19, 4),
            new SqlMetaData("NewValue", SqlDbType.Decimal, 19, 4),
            new SqlMetaData("NewPercent", SqlDbType.Decimal, 7, 2),
        };

        foreach (var r in records)
        {
            var record = new SqlDataRecord(recordsMetaData);
            record.SetDecimal(0, r.OriginalValue);
            record.SetDecimal(1, r.NewValue);
            record.SetDecimal(2, r.NewPercent);
            recordsParameter.Add(record);
        }

        var spParams = new DynamicParameters(new
        {
            currentYear = filter.currentYear,
            country = filter.country,
        });

        var recordsParam = new TableValueParameter("@records", "Record_Table_Type", recordsParameter);

        using (var connection = ConnectionFactory.GetConnection())
        {
            connection.Execute("Update_Records", ???, commandType: CommandType.StoredProcedure);
        }

Моя проблема заключается в том, как передать оба набора параметров процедуре в вызове Dapper Execute()?

Я пробовал:

var spParams = new DynamicParameters(new
{
    currentYear = filter.currentYear,
    country = filter.country,
    records = new TableValueParameter("@records", "Record_Table_Type", recordsParameter);
});

connection.Execute("Update_Records", spParams, commandType: CommandType.StoredProcedure);

и

connection.Execute("Update_Records", new Object[] { spParams, recordsParam }, commandType: CommandType.StoredProcedure);

Оба вызова процедуры, но передают пустой параметр таблицы (SELECT COUNT(*) FROM @records возвращает 0)

Я не могу найти какую-либо фактическую документацию или источник для Dapper.TVP, поэтому все это очень запутывает, а второй параметр .Execute() - это просто dynamic, так что снова не говорит мне что я могу и не могу передать ему.

Любые идеи?

4b9b3361

Ответ 1

Я нахожусь на мобильном телефоне и могу не понимать вопрос, но это должно быть справедливо:

DataTable records = ...
connection.Execute("Update_Records",
    new {
        currentYear = filter.currentYear,
        country = filter.country,
        records
    },
    commandType: CommandType.StoredProcedure
);

Ответ 2

Основываясь на ответе от Марка Гравелла здесь: Поддерживает ли Dapper SQL-таблица с табличными параметрами?

Я изменил свой код, чтобы больше не использовать Dapper.TVP и вместо этого просто использовал DataTable, поэтому код теперь:

        var recordsTable = new DataTable();
        recordsTable.Columns.Add("NewValue", typeof(Decimal));
        foreach (var netRevenue in records)
        {
            var row = recordsTable.NewRow();
            row[0] = netRevenue.NewValue;
            recordsTable.Rows.Add(row);
        }
        recordsTable.EndLoadData();

        var spParams = new DynamicParameters(new
        {
            currentYear = filter.currentYear,
            country = filter.country,
            records = recordsTable.AsTableValuedParameter("Record_Table_Type")
        });

        using (var connection = ConnectionFactory.GetConnection())
        {
            connection.Execute("Update_Records", spParams, commandType: CommandType.StoredProcedure);
        }

И это работает.

Ответ 3

Каким будет альтернатива типу DataTable, на всякий случай, если я хочу использовать его в ядре asp.net, так как в данный момент поддержка DataTable отсутствует...