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

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.