将Dapper.TVP TableValueParameter与其他参数一起使用

本文关键字:参数 一起 其他 Dapper TVP TableValueParameter | 更新日期: 2023-09-27 18:26:00

我有一个接受表值参数和其他参数的过程:

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,所以它也不能告诉我可以传递什么,不能传递什么。

有什么想法吗?

将Dapper.TVP TableValueParameter与其他参数一起使用

我在移动设备上,可能误解了这个问题,但这应该只是:

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

根据Mark Gravell的回答:Dapper支持SQL 2008表值参数吗?

我更改了代码,不再使用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);
        }

这是有效的。