Понимание SqlMapper.ICustomQueryParameter
В чем смысл метода DataTable.AsTableValuedParameter
, который возвращает SqlMapper.ICustomQueryParameter
, когда нужно передать datatable как TVP в БД с помощью Dapper?
Я мог бы отправлять TVPs в БД так же, как обычные datatable и выполнять запросы просто отлично. Я не уверен, что выполнение AsTableValuedParameter
на нем покупает дополнительно.
Например, это работает:
int rowsAffected = await conn.ExecuteAsync(
"MyProc",
new
{
myVar = (DataTable)GetThatDataTable(),
},
commandType: CommandType.StoredProcedure);
Также, дополнительный вопрос, зачем нужен typeName
необязательный параметр в методе AsTableValuedParameter
? Прекрасно работает и без него.
2 ответа:
Это прекрасно работает в вашем случае, потому что вы используете хранимую процедуру; определяемый пользователем тип должен исходить из где-то, а в случае хранимых процедур: это где-то может быть объявленный тип параметра.
Однако dapper также работает с Ad-hoc запросами
CommandText
. В этом случае без этого вызова: нет имени типа , и вызов завершится ошибкой. Для меня важно, что функции поддерживают использованиеCommandText
, так как это очень распространенный случай использования.Если это прекрасно работает для вас без: сделайте это!
Для передачи табличного параметра SQL Server требуется имя типа, поэтому он не является необязательным. Оно должно откуда-то прийти.
SqlMapper
имеет метод расширения, который задает имя типа дляDataTable
в егоExtendedProperties
. Если вы не задаете имя типа в методеAsTableValuedParameter
, он проверяет имя типа в методеExtendedProperties
.Таким образом, имя типа все еще указывается, только не в том методе, который вы ищете. Вероятно, это происходит в методе, который создает и возвращает
DataTable
. Искать использованиеpublic static void SetTypeName(this DataTable table, string typeName)
.
SqlMapper
Источник , строка 3672.Это удобно, потому что если данный тип
DataTable
существует только для передачи в качестве таблично значимого параметра, то имеет смысл связать его с типом этого параметра. Это облегчает определение того, какой схеме должен соответствоватьDataTable
.