如何从用户指定的连接字符串中检测提供程序?

时间:2009-12-16 08:26:01

标签: .net database connection-string

我的应用程序需要针对用户指定的连接字符串执行某个查询。查询将需要一些参数,因此我考虑使用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

2 个答案:

答案 0 :(得分:2)

问题是连接字符串仅在提供者的上下文中有意义而不是相反。换句话说,没有基于字符串识别提供者的标准。也就是说,您通常可以使用IndexOf来演示字符串中的提供程序。

您可以使用静态方法DbProviderFactories.GetFactoryClasses()获取已安装的提供程序列表。这将返回一个DataTable,每个提供程序都有一行。该行将包含“InvariantName”列,它将为您提供传递给DbProviderFactories.GetFactory的正确值。如果您的应用程序设计允许,您可以在获得连接字符串的同时公开可用提供程序列表,以便您的用户可以指定他们打算建立连接的提供程序。 “名称”列旨在用于此目的。

答案 1 :(得分:0)

您需要在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>