В настоящее время я использую поставщик 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
где-то? (Я не нашел ничего подобного, но я, возможно, пропустил это...)