【问题标题】:C# method returns connect to different databasesC# 方法返回连接到不同的数据库
【发布时间】:2015-01-23 16:04:24
【问题描述】:

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

该类包含返回连接到数据库的方法。早期此方法返回连接到 Advantage 数据库(AdsConnection):

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

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

该方法将在我的班级中使用公共方法。例如,从数据库中的任何表中获取数据的方法。

public static List<entity1> GetEntities(){}

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

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

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

我改变了方法:

我的第一个版本

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

谢谢。

【问题讨论】:

  • 我认为您需要重新阅读您的代码。现在使用当前(不正确的)语法,我可以做到(如果我们在 5 分钟内忘记那些语法错误):GetConnection&lt;Integer&gt;("Oracle").
  • .net 的大多数 Db 客户端都是从 IDbConnection 实现的。因此,您可以将 IDbConnection 作为返回类型。不一定必须是通用类型
  • 我个人建议采用完全不同的方法。与其创建这个通用的连接工厂,为什么不让消费代码在一个简单的using 块中简单地实例化他们自己的连接呢?保持连接的范围/生命周期很小,而不是全局。
  • @qamar 谢谢你的回答。这个解决方案对我很有帮助。
  • 同样,这并没有说明为什么您只需要一种方法。它也没有告诉我们调用代码中的 any 是否与数据库无关。您可以提供给我们的信息越多,我们在为最干净的方法提出建议方面就可以提供更多帮助。 (例如,总是有一个单一的数据库在起作用?如果是这样,为什么不把这些信息放在工厂可以检测到的地方?你可以使用依赖注入而不是静态类吗?在 中有各种各样的好处不 使用这种静态访问...)

标签: c# database oracle advantage-database-server


【解决方案1】:

一种抽象连接实例化的方法是使用 ADO.Net 的 DbProviderFactory。您基本上可以将提供者名称传递给它,它会根据提供者提供连接。这基本上为您减少了对 dbtype 等的检查,我认为当您需要针对多个数据库时,它是一种明智的方法。部分代码sn-p是从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;
}

【讨论】:

    【解决方案2】:

    您可以执行以下操作,因为两个连接都继承自 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;
    }
    

    【讨论】:

    • 感谢您的回答。这个解决方案对我很有帮助。
    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2020-04-23
    • 2013-04-15
    相关资源
    最近更新 更多