#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.