Использование 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
, так что снова не говорит мне что я могу и не могу передать ему.
Любые идеи?
Ответы
Ответ 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 отсутствует...