Понимание 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.