2015-05-08 2 views
2

Я пытаюсь использовать Dapper для вызова хранимой процедуры, которая имеет пару параметров вывода, используя VB.NET (и .NET 4.0).Добавление динамического выходного параметра Dapper в VB.NET

Тем не менее, кажется, что я не могу использовать метод DynamicParameters.Add, потому что я получаю следующее сообщение об ошибке компилятора:

'Add' is ambiguous because multiple kinds of members with this name exist in class 'Dapper.DynamicParameters'.

... когда я пытаюсь написать следующую строку:

p.Add("@NewRecordID", DbType:=DbType.Int32, direction:=ParameterDirection.Output) 

Быстрый поиск говорит мне, что это иногда случается при использовании библиотеки C#, которая имеет несколько методов, которые различаются только в случае имени (VB.NET не зависит от регистра). Поиск исходного кода Dapper для DynamicParameters показывает следующие две перегрузки для метода Add, но оба они используют один и тот же случай, и компилятор должен уметь различать эти два.

public void Add(string name, object value, DbType? dbType, ParameterDirection? direction, int? size) 

public void Add(string name, object value = null, DbType? dbType = null, ParameterDirection? direction = null, int? size = null, byte? precision = null, byte? scale = null) 

(я также пытался добавить scale:=Nothing на вызов, чтобы заставить вторую перегрузку, но безрезультатно.)

В то время как я могу обойти эту проблему с входными параметрами, передавая анонимный объект в конструктор DynamicParameters, я не могу найти способ обойти это при добавлении выходных параметров.

Я проверил ссылки на проект, чтобы убедиться, что не существует множественных или неоднозначных ссылок на сборку.

Неужели кто-нибудь столкнулся с этой проблемой раньше и нашел обходное решение?

В настоящий момент единственным вариантом, о котором я могу думать, является повторная запись вызова хранимой процедуры без использования Dapper, as implied here.

+0

Я подозреваю, что неоднозначность включает дополнительные параметры ВДобавления методов, которые означают, что единственное решение было бы изменить подпись щеголеватых методов. – MCattle

+0

Ой, это противно. К сожалению, двойная перегрузка выше типична для добавления необязательных параметров в v2 api, заставляя старый вызов иметь все необязательные параметры. –

+0

Можете ли вы попробовать 'p.Add (« @ NewRecordID », Nothing, DbType.Int32, ParameterDirection.Output, Nothing)'? –

ответ

1

Из того, что я могу собрать, следующий все возможные решения:

  1. перепишет хранимую процедуру, чтобы не использовать параметры вывода. (Опция, которую я мог использовать в этом случае.)
  2. Перепишите код, вызывающий хранимую процедуру, для использования стандартного ADO.NET.
  3. Rewrite Dapper использовать другой шаблон перегрузки для DynamicParameters.Add.
  4. Обновление проекта для использования .NET 4.5.
  5. переописать IDynamicParameter (s) или, возможно, подкласс DynamicParameters
+0

5. Реализовать IDynamicParameter (ы) или, возможно, подклассы DynamicParameters? –

+0

Отличная идея, добавлено в список. – MCattle

Смежные вопросы