是否有一个数据库连接库可以处理多种类型的数据库连接和操作(即OleDb,SQLite,ADO等)?

时间:2011-05-20 16:18:01

标签: c# database sqlite oledb

我所拥有的是我们正在处理的Access数据库,但我们需要将其转换为SQLite并将其发送到另一个客户端,同时保持代码适用于Access数据库以及所有其他人使用我们的程序。

我需要的最少的东西是可以处理Access和SQLite数据库上的连接和操作的东西。这样的事情是否存在。我知道这些数据库的数据和查询是不同的,我可以单独处理。

关于如何处理两个单独的数据库以及这种情况还有其他建议吗?

修改

我真正需要的是我可以做到的事情:

public AnyDBConnection GetConnection(string connectionString)
{
    //I guess somehow this needs to know the DB type (OleDB, SQLite, etc.)
    return new AnyDBConnection(connectionString);
}

4 个答案:

答案 0 :(得分:2)

对于较低级别的解决方案,所有ADO.NET类都具有公共基类和接口,例如DbConnectionIDbConnection等。接口位于命名空间System.Data下而抽象基类在System.Data.Common下。

大多数第3部分ADO.NET库继承/实现这些,以便可以在这些通用接口下处理所有特定于数据库的连接和命令等。他们每个人都应该有一个派生自DbProviderFactory的类,用于创建不同具体对象的集中界面。

你可以在某个地方查找一个CreateFactory方法,在配置中查找正在使用的数据库和连接字符串,然后为你创建适当的工厂对象。

答案 1 :(得分:0)

通常,人们会在这种情况下使用ORM。 LLBLGgen是商业的,但我认为如果您需要支持许多数据库,它是最先进的。此外,您可以使用企业库:

 public static Database GetDataBaseInstance()
    {
        try
        {
            //Create an object of the Database class and get the database connection info
            Database db = DatabaseFactory.CreateDatabase(SqlConnectionString);
            return db;
        }
        catch
        {
            throw;
        }
    }  

另外,请查看this文章。 并将其与您的代码一起使用。并确保您的代码兼容所有数据库类型

答案 2 :(得分:0)

我建议您使用persistence ignorance中的Domain Driven Design方法。 DDD的目的是解耦系统:模型对存储一无所知。在DDD中,您将调整存储库模式或更好Generic Repository Pattern。这种模式通常在内部使用ORM(实际上很容易添加)。因此,您可以从任何存储中保存/查询数据。

总结

  • 使用DDD
  • 实施通用存储库以实现持久性无知
  • 像NHibernate或Entity Framework一样获取ORM
  • 添加控制反转以选择所需的存储空间

答案 3 :(得分:0)

如果您拥有所有受支持数据库的ADO.NET 2.0提供程序,并且< connectionStrings>中定义了连接字符串。配置文件的一部分,您可以执行以下操作:

ConnectionStringSettings c = ConfigurationManager.ConnectionStrings[name];
DbProviderFactory factory = DbProviderFactories.GetFactory(c.ProviderName);
using(IDbConection connection = factory.CreateConnection())
{
    connection.ConnectionString = c.ConnectionString;
    ... etc
}

通常,您希望将其封装在通用DAL类中,以便例如,每次需要连接时都不需要实例化工厂。