【发布时间】:2014-10-07 18:07: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,所以再次没有告诉我我能传递给它的,不能传递给它的。
有什么想法吗?
【问题讨论】:
-
DataTable 类型的替代方案是什么,以防万一我想在 asp.net 核心中使用它,因为目前不支持 DataTable...
-
你发现了吗?如果有,能否提供答案链接?
-
你必须使用SqlDataRecords github.com/StackExchange/Dapper/blob/…
标签: c# sql-server dapper