В настоящее время я использую провайдер Microsoft ADO.NET для Oracle (System.Data.OracleClient
). Я знаю, что это, безусловно, не лучший поставщик Oracle, и что скоро будет признан устаревшим , вместо этого мне следует использовать Oracle ODP.NET. Причина, по которой я все еще пользуюсь провайдером MS, заключается в том, что ODP.NET связывает параметры по позиции , а не по имени. Это действительно может быть PITA, когда вы используете много параметров в запросе, потому что вы должны быть осторожны, чтобы добавить их в правильном порядке, что может легко привести к ошибкам. Это также раздражает, когда вы используете один и тот же параметр несколько раз в одном запросе, например:
SELECT A,B,C FROM FOO WHERE X = :PARAM_X OR :PARAM_X = 0
В ODP.NET мне нужно добавить два параметра в OracleCommand
, что я считаю глупым ...
В ODP.NET OracleCommand
есть свойство для изменения поведения по умолчанию: BindByName
. Когда установлено значение true, параметры связаны по имени, что я и хочу. К сожалению, это не очень помогает мне, потому что:
- По умолчанию установлено значение false
- Я почти никогда не использую конкретные классы ADO.NET явно, я предпочитаю использовать уровень абстракции ADO.NET 2.0 (
DbProviderFactory
, DbConnection
, DbCommand
...), чтобы уменьшить связь с какой-либо конкретной СУБД. Поэтому у меня нет доступа к свойству BindByName
, если я не приведу явно к OracleCommand
, потеряв все преимущества или абстракцию.
- При использовании ASP.NET SqlDataSource я сам не создаю DbCommand, поэтому у меня нет возможности установить
BindByName
в true (я мог бы сделать это в событии Selecting, но это действительно боль сделать это для каждого SqlDataSource ...)
Как мне решить эту проблему? Есть ли где-нибудь настройка BindByNameByDefault
? (Я не нашел ничего подобного, но, возможно, я пропустил это ...)