C# - 数据库连接字符串提供程序列表

3

我正在尝试开发一个具有多个数据库提供商的dotnet应用程序,我需要知道最常用的数据库的ConnectionString和Provider。 我正在使用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/,但我还需要提供程序。谢谢。

使用这里描述的小技巧应该可以帮助您创建至少一些安装在计算机上的提供程序的完整连接字符串。您还可以检查机器配置文件 - 它包含DbCommon可以定位的所有提供程序。我知道这不是一个完整的解决方案,所以我只是评论,而不是回答。 - Filburt
2个回答

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.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),但是我看不到提供商 :( - Eduardo Daniel Morón Arce
@EduardoDanielMorónArce 你可能会陷入64位与32位的陷阱 - 如果你只安装了32位驱动程序,你的64位应用程序将无法“看到”它(反之亦然)。如我在另一条评论中提到的,检查你的machine.config以查看注册的提供程序,DbCommon将能够使用它们。 - Filburt
@EduardoDanielMorónArce 我已经安装了MySQL和Oracle软件包,并将它们列在我的列表中 :/ - hardkoded
@kblok,你能分享链接吗? :) - Eduardo Daniel Morón Arce

1
您可以这样列出已注册的数据库提供程序:
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中注册的提供程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接