Наше устаревшее веб-приложение активно использует хранимые процедуры. У нас есть центральный интерфейс, через который выполняются все обращения к базе данных (то есть запросы и процедуры). Однако в текущей реализации используется метод OracleCommandBuilder.DeriveParameters под капотом для привязки к соответствующей сигнатуре хранимой процедуры. Из документации:
DeriveParameters требует обращения к базе данных и должен использоваться только во время разработки. Чтобы избежать ненужных обращений к базе данных в производственной среде, сам метод DeriveParameters следует заменить явными настройками параметров, которые были возвращены методом DeriveParameters во время разработки.
Мы могли бы использовать класс OracleCommand для явного связывания к правильной подписи хранимой процедуры. Однако засорение нашего кода (даже если только уровня доступа к данным) объектами OracleCommand не зависит от базы данных. Мы уже поддерживаем динамические запросы, не зависящие от базы данных, в нашем интерфейсе базы данных (далее именуемом IDatabaseService), который выглядит следующим образом:
int ExecuteNonQuery(string query, object[] parameterValues);
IDataReader ExecuteReader(string query, object[] parameterValues);
// etc.
Мы также хотим поддерживать вызовы хранимых процедур, не зависящие от базы данных. Что является хорошим шаблоном для этого?
Дополнительная информация:
Для привязки к определенной подпрограмме OracleCommands разрешают BindByName. Мы предпочитаем не использовать этот подход, поскольку строка более подвержена ошибкам, чем тип. Другой подход к связыванию вызова подпрограммы заключается в предоставлении типов параметров. Мы могли бы полагаться на значения параметров и размышлять о типах времени выполнения, но нам нужна более сильная безопасность. Мы хотим потребовать, чтобы типы были явно предоставлены интерфейсу базы данных, чтобы мы могли проверить, соответствуют ли предоставленные значения параметров предоставленным типам параметров подпрограммы, прежде чем мы будем связываться с базой данных.