«Есть ли способ получить один токен для всех провайдеров?»
Да, но это требует некоторой настройки. Вы можете получить полезную информацию о конкретном поставщике базы данных из существующего DBConnection
. Сначала извлеките таблицу DataSourceInformation из соединения:
DbConnection connection = GetSomeConnection();
var infoTable = connection.GetSchema(DbMetaDataCollectionNames.DataSourceInformation);
В этой таблице будет одна строка с различной информацией о поставщике. Что касается именования параметров, будет столбец с именем ParameterMarkerPattern
, представляющий строку шаблона Regex
для проверки параметра. Если в этом столбце есть данные, первым символом будет ваш маркер DbParameter
. Если столбец пуст, ParameterMarkerFormat
может дать вам строковый формат, который будет применяться при построении имени вашего параметра.
«Но это действительно некрасиво писать в больших SQL».
На самом деле это не обойдется, если вы рассматриваете возможность прямого форматирования SQL, и ваш обходной путь уже намного проще, чем этот. Однако дополнительных данных, которые вы получаете от DataSourceInformation
, должно быть достаточно для передачи собственной строки методу создания, который заменит начальный символ параметра по умолчанию (например, @
) на соответствующий от поставщика. :
string sql = SqlIfy("SELECT name FROM user WHERE id = @id");
Вы можете пойти еще дальше и сделать то же самое для указанных в кавычках идентификаторов. Вы можете передать что-то вроде:
"SELECT [Name] FROM [dbo].[SomeTable]"
и получилось так, как
SELECT "Name" FROM "dbo"."SomeTable"
Все зависит от провайдера. Если вы хотите динамически создавать запросы на каком-либо пользовательском базовом классе провайдера, вы можете открыть исходное соединение и сохранить все данные, относящиеся к провайдеру. Вы не хотите звонить DbConnection.GetSchema
каждый раз, когда используете соединение.
SQL Server:
Oracle: