c# - 将 Dapper.TVP TableValueParameter 与其他参数结合使用

标签 c# sql-server dapper

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

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() 的第二个参数只是一个 动态,这样就不会再告诉我什么可以传递给它,什么不能传递给它。

有什么想法吗?

最佳答案

我使用的是移动设备,可能会误解这个问题,但这应该是:

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

关于c# - 将 Dapper.TVP TableValueParameter 与其他参数结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26242363/

相关文章:

sql-server - 如何使用 VBA 将 Access 表链接到 SQL Server

c# - 为什么 dapper 在执行选择时为 Guid 返回全零,但表中的 guid 值设置正确?

c# - 什么时候使用缓存太多了?

c# - 如何为 linq 查询创建一个类 (EF)

c# - StructureMap - 根据具体请求实例化接口(interface) x 实例的属性

c# - 如何在 Dapper 中使用 IN

c# - 如何在SQL参数中添加多个 "WHERE conditionA OR conditionB OR conditionC"?

c# - Paypal Ipn 与 asp.net MVC 集成

使用 Openrowset 从 Excel 2016 中提取数据的 SQL 查询 - 出现语法错误

sql - 与 SQL 中的 IFERROR 等效的功能?