Разделители параметров - PullRequest
4 голосов
/ 17 декабря 2011

У меня есть приложение на C #, которое мы кодировали в ADO.NET. Я использовал интерфейсы IDbCommand и IDbConnection для создания кросс-базы данных.

До сих пор все работало замечательно (в Firebird, SQLite, SQL Server 2005 и 2008, Access 2007, Access 2010 и Oracle 11g).

Проблема у меня есть, у меня теперь есть база данных Oracle 10g, которую я должен поддерживать.

Все «нормальные» вещи, создание соединений и команды работают нормально, однако, когда я иду, чтобы создать параметр с использованием интерфейса IDataParameter и cmd.CreateParamater() не удается на 10g, из-за синтаксиса параметров в запросе (I использую параметризованные запросы).

Судя по всему, Oracle 10g из коробки не поддерживает использование знака @. Oracle 11g, SQL Server и все другие, упомянутые выше, делают.

Например, следующий запрос не будет выполнен в 10g:

select * from Products where ProductId = @ProductId

Но, если я использую двоеточие, оно будет работать нормально, используя вышеупомянутые интерфейсы ado.net, поэтому этот запрос будет выполнен успешно:

select * from Products where ProductId = :ProductId

К сожалению, двоеточие не работает в большинстве других реализаций базы данных.

Или есть опция, которую можно переключить в базе данных Oracle 10g, которая позволяет использовать разделитель @ вместо разделителя : для параметров.

Текущее решение, которое у меня есть, далеко не идеальное, у меня есть клиент / клиент, инициализирующий свойство ParameterDelimiter (по умолчанию используется знак @), и использую string.Format, чтобы вставить ParameterDelimiter ,

Есть ли какой-нибудь стандартный способ сделать это, которого я упускаю, без необходимости предоставления клиентом разделителя или без знания моих базовых библиотек о реализации базы данных? (Например, включая ODP.NET и проверку на OracleConnection)

1 Ответ

8 голосов
/ 17 декабря 2011

Для чего это стоит, я нашел этот пост:

Какой маркер параметра следует использовать? ADO.NET 2.0, Sql Server @, Oracle: (ссылка не работает)

упоминается в этом вопросе:

Получить префикс параметра в ADO.NET

С помощью следующего кода, запрашивающего информацию у объекта соединения:

string format = connection
  .GetSchema("DataSourceInformation")
  .Rows[0]["ParameterMarkerFormat"]
  .ToString();

Так что это должен быть «стандартный способ сделать это», также без необходимости предоставления клиентом информации и без необходимости знать о реализации базы данных.

Редактировать: необходимо добавить, что System.Data.SqlClient.SqlConnection, по-видимому, возвращает {0} вместо @{0}.

...