我需要在Asp.Net和C#中创建一个基于Web的数据库应用程序,它将适用于所有数据库提供程序,如SQL Server,MySQL等。如果客户端有SQL Server,程序中的一个小改动应该使我的Web应用程序可以使用SQL Server,如果客户端有MySQL,它也应该与MySQL一起使用。
是否有可用的工具?或者我是否应该遵循任何编程程序或方法来实现它?
所以指导我实现上述方案。
答案 0 :(得分:2)
为了保持外部系统(例如数据库)的独立性,您需要将解决方案设计为仅与接口通信。然后,您可以使用多种技术(包括依赖项注入)来确定在运行时使用哪种实现。
为了简单起见,让我们只使用工厂。
首先要确定数据库应该做什么。简单的例子 - 我们将存储或检索整数。所以首先让我们定义那个接口。我为了简单而省略了异步 - 但是在与DB交谈时你真的想要它。
public interface IDatabase{
void Store(int value);
int Get();
}
所以现在我们的调用代码可以用来引用任何类型的数据库。
接下来,我们需要为每个DB提供不同类型的类
public class SqlServerDB : IDatabase{
public void Store(int value){//store it}
public void Get(){//get it}
}
public class MySqlDB : IDatabase{
public void Store(int value){//store it}
public void Get(){//get it}
}
同样,您不希望调用代码知道实现,因此您无法仅使用new实例化该对象。相反,您需要构建一个知道不同类型数据库的类。
我在这里使用了一个字符串,但你应该在实际代码中使用枚举。
public static class DatabaseFactory{
public static IDatabase GetDatabase(string dbName){
switch(dbName){
case "sqlserver":
return new SqlServerDB();
case "mysql":
return new MySqlDB();
default:
throw new ArgumentException("Don't know about that DB");
}
}
}
现在您的调用代码不必随DB更改。如果您有一个配置对象(比如内置的.NET对象),您可以轻松更改正在使用的数据库。
IDatabase myDB = DatabaseFactory.GetDatabase(Config.DBName);
myDB.Store(191);
int result = myDB.Get();
//result will equal 191!
答案 1 :(得分:1)
我会使用dapper这是.Net的微型ORM。它支持sqlite,SQL Server CE,Firebird,Oracle,MySQL,PostgreSQL和SQL Server。
我个人非常满意使用dapper,它实际上是由Stack Overflow开发和使用的。
答案 2 :(得分:0)
使用SimpleData http://simplefx.org/simpledata/docs/超级易用且支持: SQL Server 2005及更高版本 SQL Server Compact Edition 4.0 神谕 VistaDB的 mysql 4.0及更高版本 sqlite 3.0及更高版本 PostgreSQL的 SQLAnywhere的 Informix的 Microsoft Access 2000,2003和2007