我想为不同的数据库构建一个可配置的数据访问层。
我们正在开发一个产品(基于Web的应用程序),客户端可以选择MS Access或Sql作为后端数据库。
所以,我想开发一个数据访问层,这样如果一个客户端想要使用MS Access作为后端,那么我会使用内联查询(动态查询)进行数据访问,如果另一个客户端想要使用Sql作为后端,那么我将使用存储过程进行数据访问。
请帮我设计这种架构,它应该是可配置的。
我想要实现的是为Model和DAL提供单独的层;当我从Page调用DAL方法时,它应该调用数据库类型。
模型
DAL
EmployeeAccessDb(使用内联查询)
EmployeeSqlDb(使用存储过程)
页
答案 0 :(得分:0)
我认为这不会涉及大量的工作,但是为了让你从这里开始是一个快速的方法,你可以扩展:
public class DataAccess
{
private DbProviderFactory factory;
private DbConnection connection;
public enum Provider
{ SQL, Access }
public DataAccess(Provider provider)
{
switch (provider)
{
case Provider.Ole:
factory = DbProviderFactories.GetFactory("System.Data.OleDb");
break;
case Provider.Sql:
factory = DbProviderFactories.GetFactory("System.Data.SqlClient");
break;
}
this.connection = factory.CreateConnection();
}
public DbDataReader GetDataReader(string statement, params DbParameter[] parameters)
{
using (DbCommand command = factory.CreateCommand())
{
if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
command.CommandText = statement;
command.Connection = connection;
parameters.ToList().ForEach(x => command.Parameters.Add(x));
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
}
}
public enum Provider
{ SQL, Access }
public DataAccess(Provider provider)
{
switch (provider)
{
case Provider.Ole:
factory = DbProviderFactories.GetFactory("System.Data.OleDb");
break;
case Provider.Sql:
factory = DbProviderFactories.GetFactory("System.Data.SqlClient");
break;
}
this.connection = factory.CreateConnection();
}
public DbDataReader GetDataReader(string statement, params DbParameter[] parameters)
{
using (DbCommand command = factory.CreateCommand())
{
if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
command.CommandText = statement;
command.Connection = connection;
parameters.ToList().ForEach(x => command.Parameters.Add(x));
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
}
}
无论何时想要创建命令或参数等,都要使用工厂变量。
如果你想要更多特定的Access自定义代码,那么你需要使用继承模型,但我想SQL和Access有相同的语法,即相同的SELECT,INSERT命令等?