我所拥有的是我们正在处理的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);
}
答案 0 :(得分:2)
对于较低级别的解决方案,所有ADO.NET类都具有公共基类和接口,例如DbConnection
,IDbConnection
等。接口位于命名空间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(实际上很容易添加)。因此,您可以从任何存储中保存/查询数据。
总结
答案 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类中,以便例如,每次需要连接时都不需要实例化工厂。