C#方法returns连接不同的数据库

C# method returns connect to different databases

更新: 我有一个用于处理数据库的静态 class。

此 class 包含 return 连接到数据库的方法。早期此方法 returns 连接到 Advantage 数据库 (AdsConnection):

static private AdsConnection GetConnection(){
    var conn = new AdsConnection();
    conn.ConnectionString = here my connection string
    return conn;
}

现在,我需要改变这个方法。我需要此方法 returns 连接到不同的数据库类型(Advantage 数据库、Oracle 数据库)。

该方法将用于我的 class 中的 public 方法。例如,从数据库中的任何 table 获取数据的方法。

public static List<entity1> GetEntities(){}

进入这个方法我的第一步是解析数据库的类型,然后连接到数据库。然后从数据库中获取数据最后一步是return数据(List).

在连接数据库的步骤中我需要使用方法GetConnection("Ads")

此方法return当前连接到数据库,然后我可以使用此连接进行工作

我改变了方法:

我的第一个版本

static private T GetConnection<T>(string dbType)
        {
            if (dbType.Equals("Oracle"))
            {
                OdbcConnection conn = new OdbcConnection
                conn.ConnectionString = here my connection string
                return (T)conn;
            }

            if (dbType.Equals("Ads"))
            {
                AdsConnection conn = new AdsConnection
                conn.ConnectionString = here my connection string
                return (T)conn;
            }

            return default(T);
        }

但是,我的解决方案不起作用。我有错误:

  1. 无法将类型 'System.Data.Odbc.OdbcConnection' 转换为 'T'
  2. 无法将类型 'Advantage.Data.Provider.AdsConnection' 转换为 'T' 我不知道如何解决我的问题。

请告诉我如何解决我的问题?

现在,我使用下面的代码(这个解决方案给我@khlr):

static private IDbConnection GetConnection(string dbType)
{
    if (dbType.Equals("Oracle"))
    {
        OdbcConnection conn = new OdbcConnection
        conn.ConnectionString = here my connection string
        return conn;
    }

    if (dbType.Equals("Ads"))
    {
        AdsConnection conn = new AdsConnection
        conn.ConnectionString = here my connection string
        return conn;
    }

    return null;
}

谢谢。

您可以执行以下操作,因为两个连接都继承自 IDbConnection

static private IDbConnection GetConnection(string dbType)
{
    if (dbType.Equals("Oracle"))
    {
        OdbcConnection conn = new OdbcConnection
        conn.ConnectionString = here my connection string
        return conn;
    }

    if (dbType.Equals("Ads"))
    {
        AdsConnection conn = new AdsConnection
        conn.ConnectionString = here my connection string
        return conn;
    }

    return null;
}

抽象连接实例化的一种方法是使用 ADO.Net 的 DbProviderFactory。您基本上可以将提供者名称传递给它,它会根据提供者提供连接。这基本上减少了对 dbtype 等的检查,我认为当您需要针对多个数据库时,它是明智的方法。部分代码片段复制自MSDN。

在您的配置文件中,您可以使用不同的数据库类型和提供程序设置多个连接字符串。

<configuration>

<add name="NorthwindAccess" 
 providerName="System.Data.OleDb" 
 connectionString=
 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Northwind.mdb;"
/>

然后在您的方法中您可以执行以下操作:

    static DbConnection CreateDbConnection(
    string providerName, string connectionString)
{
    // Assume failure.
    DbConnection connection = null;

    // Create the DbProviderFactory and DbConnection. 
    if (connectionString != null)
    {
        try
        {
            DbProviderFactory factory =
                DbProviderFactories.GetFactory(providerName);

            connection = factory.CreateConnection();
            connection.ConnectionString = connectionString;
        }
        catch (Exception ex)
        {
            // Set the connection to null if it was created. 
            if (connection != null)
            {
                connection = null;
            }
            Console.WriteLine(ex.Message);
        }
    }
    // Return the connection. 
    return connection;
}