Как определить провайдера из указанной пользователем строки подключения?

Моему приложению необходимо выполнить определенный запрос к указанной пользователем строке подключения. Запросу потребуются некоторые параметры, поэтому я подумал об использовании DbProviderFactory в сочетании с myConnection.GetSchema("DataSourceInformation").Rows[0]["ParameterMarkerFormat"], чтобы узнать, нужно ли мне использовать :(Oracle), @(Sql) или ?(OleDb) для отправки параметров в базу данных. .

Чтобы использовать DbProviderFactory, мне нужно выяснить, какой Provider необходим для строки подключения. Есть ли хороший способ сделать это, или мне нужно использовать какую-то логику if(conStr.indexOf("oledb") != -1) { type = DbTypes.OleDB; }? (Или есть лучший способ подключиться к «неизвестному» типу базы данных?)

Примечание. DbProviderFactory ожидает, что поставщик будет иметь форму System.Data.SqlClient, а не SQLNCLI.1, которая находится в фактической строке подключения.


person Espo    schedule 16.12.2009    source источник


Ответы (2)


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

Вы можете получить список установленных провайдеров с помощью статического метода DbProviderFactories.GetFactoryClasses(). Это вернет DataTable со строкой для каждого поставщика. В строке будет столбец «InvariantName», который даст вам правильное значение для передачи в DbProviderFactories.GetFactory. Если дизайн вашего приложения позволяет, вы можете предоставить список доступных провайдеров одновременно с получением строки подключения, чтобы ваши пользователи могли указать, к какому провайдеру они намерены подключиться. Столбец «Имя» предназначен именно для этой цели.

person Jacob Proffitt    schedule 23.09.2010

Вам нужно указать это в вашем файле app.config. Из MSDN,

<configuration>
  <connectionStrings>
    <clear/>
    <add name="NorthwindSQL" 
     providerName="System.Data.SqlClient" 
     connectionString=
     "Data Source=MSSQL1;Initial Catalog=Northwind;Integrated Security=true"
    />

    <add name="NorthwindAccess" 
     providerName="System.Data.OleDb" 
     connectionString=
     "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Northwind.mdb;"
    />
  </connectionStrings>
</configuration>
person Shamika    schedule 16.12.2009
comment
Как это поможет мне определить, какой провайдер мне понадобится для подключения к строке подключения к базе данных, указанной пользователем во время выполнения? - person Espo; 16.12.2009
comment
Кажется, я неправильно понял ваш вопрос. Я думаю, что в этом случае вам нужно выполнить некоторую пользовательскую логику if/else для идентификации поставщика БД. - person Shamika; 17.12.2009