Существует ли разработчик для поставщиков данных .net, которые не поддерживают именованные параметры SQL?

#sql #.net #ado.net #sqlparameter

Вопрос:

Я хочу разрешить своим пользователям подключаться к базе данных различными способами:

  • либо с конкретной базой данных ADO.NET поставщик, например, MySqlConnector или Npgsql
  • или создав DSN в Windows, а затем используя типы в System.Data.Odbc пространстве имен для использования базы данных

Последнее было бы очень полезно по соображениям обратной совместимости.

В своем коде я использую абстрактные типы. В принципе, я должен иметь возможность использовать одни и те же операторы SQL, независимо от того, какой способ подключения выбирают мои клиенты.

Теперь проблема, с которой я сталкиваюсь, связана с именованными параметрами SQL (а не только с позиционными параметрами). Используя ODBC, я не нашел способа использовать их, например, в запросе типа

 SELECT alpha, beta
FROM gamma
WHERE delta = @epsilon
 

В некоторых диалектах SQL»: «вместо» @ » используется для префикса параметров, но здесь проблема не в этом. Система.Данные.Odbc, похоже, вообще не передает (именованные) параметры.

Существует ли уже какая-то оболочка вокруг System.Data.Odbc, который позволяет использовать параметры SQL? Какой-то декоратор для System.Data?

Комментарии:

1. Обратите внимание, что в вашем примере в качестве имени столбца используется параметр, который не поддерживается многими базами данных, независимо от ODBC или нет. Ты это имел в виду WHERE epsilon = @delta ? Это было бы более реалистичным примером обычного использования параметров.

2. Но поставщик ODBC поддерживает параметры — просто не именованные параметры. Я бы ожидал WHERE epsilon = ? , что все будет хорошо.

3. В нескольких сценариях ODBC параметры являются анонимными и позиционными, т. Е. where Foo = ? означают «привязка к следующему параметру» (каждый последующий ? означает следующий, если вы понимаете, что я имею в виду; позаимствовать пример из MSDN: INSERT INTO Parts (PartID, Description, Price) VALUES (?, ?, ?) привязывается к 3 последовательным параметрам); вы уверены, что это недоступно? но чтобы ответить на прямой вопрос: нет, я не знаю декоратора, который бы переписал это для вас

4. @JonSkeet и МаркГравелл, спасибо, что указали на мои ошибки в вопросе. Я исправляюсь. Вопрос скорее в том, существует ли уже что-то, чтобы использовать именованные вместо позиционных параметров.

5. @pvoosten знаете ли вы о каком-либо поставщике, который не поддерживает параметры? Как ODBC, так и OLEDDB имеют параметры, и, соответственно, так же ADO.NET.