【问题标题】:C# - List of Database connectionsStrings ProviderC# - 数据库连接字符串提供程序列表
【发布时间】:2017-10-05 19:34:58
【问题描述】:

我正在尝试开发具有多个数据库提供程序的 dotnet 应用程序,我需要知道最常用数据库的 ConnectionString 和提供程序。我使用 System.DBCommon。这是我的代码:

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);
                      }
                  }
              }
          }
      }
  }

我在这个站点中找到了连接字符串 https://www.connectionstrings.com/

但我也需要提供者。 谢谢

【问题讨论】:

  • 使用this little trick described here 应该可以帮助您为安装在您机器上的提供程序创建至少一些完整的连接字符串。您还可以检查机器配置 - 它包含 DbCommon 可以定位的所有提供程序。我知道这不是一个完整的解决方案,所以我只评论,不回答。

标签: c# sql database provider


【解决方案1】:

连接字符串属性中的提供者名称不是一个类而是一个命名空间,例如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.OleDbConnection
  • 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

【讨论】:

  • 谢谢,我现在可以得到提供者的名字了:)。如何添加新的提供程序(mysql、postgreSQL 或 oracle)。我安装了 Mysql.data.MySqlClient dll(使用 nuget),但我看不到提供程序 :(
  • @EduardoDanielMorónArce 您可能会陷入 64 位与 32 位的陷阱 - 如果您只安装 32 位驱动程序,您的 64 位应用程序无法“看到”它(反之亦然)。正如我在其他评论中提到的,检查您的 machine.config 以查看 DbCommon 将能够使用的注册提供程序。
  • @EduardoDanielMorónArce 我已经安装了 MySQL 和 Oracle 软件包,并将它们放在我的列表中:/
  • @kblok 你能分享链接吗? :)
【解决方案2】:

您可以像这样列出已注册的数据库提供程序:

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 中注册的提供程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2011-01-26
    • 2016-04-03
    • 2021-03-28
    相关资源
    最近更新 更多