Решение проблемы с именованным параметром оказалось из-за того, что для команд Oracle для свойства BindByName установлено значение true. Для решения этой проблемы потребовалась настройка самого SqlMapper. Это немного неприятно, так как твик не переносим (он полагается на проверку типа для определенной команды Oracle), но на данный момент он работает для наших нужд. Это изменение включает обновление метода SetupCommand, после создания команды из объекта подключения мы печатаем команду check и устанавливаем флаг следующим образом (~ ln 635):
var cmd = cnn.CreateCommand();
if (cmd is OracleCommand)
{
((OracleCommand)cmd).BindByName = true; // Oracle Command Only
}
Наконец, для решения проблемы «@» в «:» в именах параметров необходимо изменить метод CreateParamInfoGenerator. Я добавил статическую строку - DefaultParameterCharacter, установив ее значение в ":", затем изменил ln 530 из:
il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [c
до
il.Emit(OpCodes.Ldstr, DefaultParameterCharacter + prop.Name); // stack is now [parameters] [command] [name] (Changed @ to : for oracle)
и № 546 от:
il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [parameters] [parameter] [parameter] [name] (Changed @ to : for oracle)
до:
il.Emit(OpCodes.Ldstr, DefaultParameterCharacter + prop.Name); // stack is now [parameters] [parameters] [parameter] [parameter] [name] (Changed @ to : for oracle)
Это позволило безупречно работать командам Oracle