Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

(и т.д.)

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

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

Ответ 2

Разрешение проблемы с именованным параметром оказалось из-за того, что для команд Oracle требуется, чтобы свойство BindByName было равно true. Чтобы решить эту проблему, требуется настройка самого SqlMapper. Это немного неприятно, поскольку tweak is not portable (он полагается на проверку типа для определенной команды Oracle), но он работает для наших нужд на данный момент. Это изменение включает в себя обновление метода SetupCommand после создания формы команды, которую мы вводим для объекта соединения, и установите флаг так (~ 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)

и 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