2017-05-07 63 views
3

我試着去開發帶有多個數據庫提供商的dotnet應用程序,我需要知道的ConnectionString和最常用的數據庫提供商。我使用System.DBCommon。這是我的代碼:C# - 數據庫connectionsStrings提供商的名單

public class DBConnector 
{ 

    public void ConectDatabase() 
    { 
     { 
      string connectionString = 
      "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" + 
      "(HOST=MYHOST)(PORT=1527))(CONNECT_DATA=(SID=MYSERVICE)));" + 
      "User Id=MYUSER;Password=MYPASS;"; //Connection String 
      string provider = 
      "Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess"; //I need this for the most used databases (Mysql, PostgreSQL, SqlServer) 


      using (DbConnection conn = (DbConnection)Activator. 
      CreateInstance(Type.GetType(provider), connectionString)) 
      { 
       conn.Open(); 
       string sql = 
       "select distinct owner from sys.all_objects order by owner"; 
       using (DbCommand comm = conn.CreateCommand()) 
       { 
        comm.CommandText = sql; 
        using (DbDataReader rdr = comm.ExecuteReader()) 
        { 
         while (rdr.Read()) 
         { 
          string owner = rdr.GetString(0); 
          Console.WriteLine("{0}", owner); 
         } 
        } 
       } 
      } 
     } 
    } 

我發現的ConnectionStrings在這個網站 https://www.connectionstrings.com/

但我需要的供應商了。 由於

+0

使用[此處介紹的這個小技巧](http://stackoverflow.com/a/10480011/205233)應該可以幫助您爲機器上安裝的提供程序創建至少一些完整的連接字符串。您也可以檢查機器配置 - 它包含DbCommon可以定位的所有提供者。我知道這不是一個完整的解決方案,所以我只評論,而不是回答。 – Filburt

回答

2

在連接字符串屬性的提供者的名字是不是一類而是一個命名空間,例如System.Data.SqlClient的是不是一個階層,而是一個命名空間,該命名空間下你的SqlConnection,SqlCommand的等

你可以嘗試尋找實現IDbConnection接口的所有類,然後根據該類型創建的IDbConnection:

var types = AppDomain.CurrentDomain.GetAssemblies() 
    .SelectMany(s => s.GetTypes()) 
    .Where(p => typeof(IDbConnection).IsAssignableFrom(p) && p.IsClass); 

foreach(var dbConnection in types) 
{ 
    Console.WriteLine(dbConnection); 
} 

安裝MySQL和Oracle包之後,這是結果列表

  • System.Data.SqlClient.SqlConnection
  • System.Data.OleDb.Ol eDbConnection
  • System.Data.Odbc.OdbcConnection
  • System.Data.Common.DbConnection
  • MySql.Data.MySqlClient.MySqlConnection
  • Oracle.ManagedDataAccess.Client.OracleConnection

您可以檢查這裏https://github.com/kblok/StackOverflowExamples/blob/master/AspNetDemoProject/AspNetDemoProject/Demos/ProvidersList.aspx.cs

+0

謝謝,我現在可以得到提供商的名稱:)。我如何添加新的提供者(mysql,postgreSQL或oracle)。我安裝了Mysql.data.MySqlClient dll(使用nuget),但我無法看到提供者:( –

+0

@EduardoDanielMorónArce您可能會陷入64位和32位的陷阱 - 如果您只安裝32位驅動程序,您的64位應用程序無法「看到」它(反之亦然)正如我在其他評論中提到的,檢查你的machine.config以查看註冊供應商DbCommon將能夠使用。 – Filburt

+0

@EduardoDanielMorónArce我已經安裝了MySQL和Oracle軟件包,並在列表中列出了它們:/ – hardkoded

0

的源代碼,可以列出註冊DB提供這樣的:

using System; 
using System.Data; 
using System.Data.Common; 

namespace StackOverflowExamples 
{ 
    class AvailableDataProviders 
    { 
     public static void Main(string[] args) 
     { 
      using (DataTable providers = DbProviderFactories.GetFactoryClasses()) 
      { 
       Console.WriteLine("Available Data Providers:"); 

       foreach (DataRow provider in providers.Rows) 
       { 
        Console.WriteLine(); 
        Console.WriteLine("Name: {0}", provider["Name"]); 
        Console.WriteLine("Description: {0}", provider["Description"]); 
        Console.WriteLine("Invariant Name: {0}", provider["InvariantName"]); 
        Console.WriteLine("AssemblyQualifiedName: {0}", provider["AssemblyQualifiedName"]); 
       } 
      } 
     } 
    } 
} 

有可能在不被你的應用程序(在的app.config或web.config文件)或(在machine.config中)或框架註冊你的機器應用程序的組件供應商類。

您的應用程序只能使用在你的應用程序配置的system.data -> DbProviderFactories註冊的供應商。