Использование Dapper с Oracle

мы используем Oracle в качестве поставщика базы данных и рассмотрели замену некоторых из наших уровней доступа к данным (трудно поддерживать, труднее объединить XSD) с более разумным шаблоном на основе репозитория, используя Dapper в нижнем слое. Тем не менее, мы столкнулись с рядом проблем при использовании его с oracle.

  • именованные параметры: они, похоже, игнорируются, когда они используются в запросе Oracle, похоже, интерпретирует их в любом порядке. В SqlMapper правильно возвращает именованные параметры, они просто неправильно интерпретируются в Oracle

  • соглашение об именах "@" для переменных несовместимо с именованными параметрами oracle. Он ожидает увидеть ": "перед любыми параметрами

кто-нибудь ранее сталкивался с этим и имел какие-либо обходные пути?

2 ответов


ИМО, правильный подход здесь-это не to (согласно принятому ответу) используйте префикс конкретного параметра базы данных (so @ для sql-server,: для oracle) - но скорее: не используйте префикс на всех. Так что в конечном счете это:

il.Emit(OpCodes.Ldstr, prop.Name);

(и т. д.)

в частности, a static свойство было бы плохо, так как это ограничило бы вас одним поставщиком за AppDomain.

Dapper был обновлен с этим изменением. Он также теперь динамически обнаруживает BindByName и устанавливает его соответственно (без ссылки на OracleCommand).


решение проблемы с именованным параметром оказалось потому, что команды Oracle требуют, чтобы свойство BindByName имело значение true. Для решения этой проблемы требуется настройка самого SqlMapper. Это немного неприятно, поскольку настройка не переносится (она зависит от проверки типа для конкретной команды Oracle), но она работает для наших нужд на данный момент. Изменение включает в себя обновление метода SetupCommand, после создания командной формы объекта соединения мы вводим check и устанавливаем флаг следующим образом (~ln 635):

var cmd = cnn.CreateCommand();
if (cmd is OracleCommand)
{
    ((OracleCommand)cmd).BindByName = true; // Oracle Command Only
}

наконец, чтобы решить проблему " @ "to": "проблема в именах параметров связана с изменением метода CreateParamInfoGenerator. Я добавил статическую строку-DefaultParameterCharacter, установив ее значение в ":", затем изменил ln 530 из:

il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [c

to

il.Emit(OpCodes.Ldstr, DefaultParameterCharacter + prop.Name); // stack is now [parameters] [command] [name] (Changed @ to : for oracle)

и ln 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)

это заставило dapper работать безупречно с командами Oracle