Изысканная процедура или функция sp_XXXX имеет слишком много аргументов.

Я использую объект DynamicParamters Dapper с аргументом шаблона для создания аргументов с моими сущностями. После вызова хранимой процедуры я получаю следующую ошибку: «Процедура или функция sp_MemberSave имеет слишком много аргументов». У меня есть дополнительные свойства для некоторых моих сущностей для бизнес-логики и т. д. Есть ли способ убедиться, что dapper передает только те параметры, которые являются фактическими параметрами для хранимой процедуры? Похоже, что Dapper сначала прочитает хранимую процедуру, а затем установит параметры, таким образом, он будет использовать только те, которые верны. Как ограничить параметры, используя возможности шаблона?


person user1790300    schedule 18.06.2013    source источник
comment
Вы передаете свой объект (экземпляр вашего класса) в качестве параметра хранимой процедуре?   -  person von v.    schedule 18.06.2013
comment
Я вызываю DynamicParameters(entity), где объект является одним из моих объектов. Я думал, что это сгенерирует коллекцию Parameters, прочитав сущность и сгенерировав коллекцию Parameters. Я также думал, что он будет игнорировать любые параметры, которые не являются фактическими сохраненными параметрами процедуры. Так ли это?   -  person user1790300    schedule 18.06.2013


Ответы (2)


Попробуйте создать анонимный тип соответствующих параметров из вашего объекта... Если в вашем классе есть A, B, C и D, а вам нужны только A и B:

DynamicParameters(new { A = entity.A, B = entity.B });
person Haney    schedule 18.06.2013
comment
Я надеялся, что мне не придется делать это таким образом, так как есть много параметров. Много. - person user1790300; 18.06.2013
comment
Я понимаю. Мы написали оболочку для Dapper в моей компании, которая имеет несколько полезных функций... одна из которых — добавление атрибута [NotParameter], который позволяет оболочке игнорировать свойства/поля. - person Haney; 18.06.2013
comment
Я просматривал их код, чтобы найти место для фильтрации параметров по мере их добавления, но раздел, который выполняет добавление, показался немного сложным для понимания :-). - person user1790300; 18.06.2013
comment
В Dapper используется множество ExpressionTrees и отражений для создания методов "на лету"... Правильно, заметьте. - person Haney; 18.06.2013
comment
Верно. Кажется, я нашел, где он генерирует параметры, пытаясь это перевести. Хотя, это интересно. - person user1790300; 18.06.2013
comment
Из-за полного разочарования я думаю, что мне придется создать анонимный тип. Спасибо, ребята, за помощь. - person user1790300; 18.06.2013
comment
Хорошо, Дэвид Х. Когда ваша команда создала атрибут [NoParameter], вы создали метод расширения, который будет преобразовывать сущность в список параметров с помощью отражения. Если это так, мой единственный вопрос будет заключаться в том, заметили ли вы какие-либо удары по производительности при использовании отражения? - person user1790300; 18.06.2013
comment
Мы создали посредника, который создал бы анонимный тип и сопоставил его... И изначально это было удачно, но мы скомпилировали метод и кэшировали его, чтобы в будущем использовать его почти так же быстро, как метод времени компиляции. - person Haney; 18.06.2013
comment
@Haney, возможно ли, что вы можете поделиться кодом, который вы, ребята, написали в качестве оболочки для dapper, с [NotParameter]. Благодарность - person VR1256; 04.06.2018

Могу ли я быть очень ясным по сценарию здесь? если вы просто передаете объект (а не DynamicParameters), он выполняет этот анализ; то есть conn.Execute("some sql", someEntity); - тогда он добавит только те члены someEntity, которые, как он видит, используются в SQL. Могут быть некоторые ложные срабатывания, поскольку он не выполняет полный лексический анализ SQL, поэтому параметр в комментариях, т. е.:

-- removed by Fred: where row.Date < @StartDate

все равно будет включен (поэтому в приведенном выше примере участник StartDate будет иметь право на участие, даже если он, вероятно, на самом деле не нужен).

Однако; DynamicParameters в настоящее время доверяет пользовательской реализации. Я полагаю, что мы могли перенести проверку анализа параметров на более поздний этап, но я бы предпочел сначала понять весь сценарий.

person Marc Gravell    schedule 18.06.2013
comment
... он выполняет этот анализ - выполняет ли он анализ хранимых процедур (что и использует OP)? - person Joe; 20.10.2013
comment
@Joe, если тип команды говорит о хранимой процедуре, то нет: это не так. Однако также возможно использовать хранимые процедуры через текстовый командный тип (через exec) — такое я вижу довольно часто — отсюда и желание увидеть очень наглядный пример. Но одно можно сказать наверняка: dapper никогда не попытается сначала прочитать хранимую процедуру. - person Marc Gravell; 21.10.2013