1

我想为不同的数据库构建一个可配置的数据访问层。

我们正在开发一个产品(基于 Web 的应用程序),客户端可以选择 MS Access 或 Sql 作为后端数据库。

所以,我想开发一个数据访问层,这样如果一个客户端想要使用 MS Access 作为后端,那么我将使用内联查询(动态查询)进行数据访问,如果另一个客户端想要使用 Sql 作为后端,那么我将使用存储数据访问程序。

请帮我设计这种架构,它应该是可配置的。

在这里,我想要实现的是为模型和 DAL 设置单独的层;当我从 Page 调用 DAL 方法时,它应该根据数据库类型调用。

模型

  • 员工
    • ID
    • 姓名

达尔

  • EmployeeAccessDb(使用内联查询)

    • 得到所有
    • 获取ID
    • 插入
    • 更新
    • 删除
  • EmployeeSqlDb(使用存储过程)

    • 得到所有
    • 获取ID
    • 插入
    • 更新
    • 删除

  • ObjectDataSource SelectMethod="GetAll" TypeName=" < EmployeeAccessDb / EmployeeSqlDb >"
  • 插入
  • 更新
  • 删除
4

1 回答 1

0

我认为这不会涉及大量工作,但让您从这里开始是一种快速的方法,您可以扩展它:

  1. 将需要一个代表您的不同提供者的枚举,即 SQL、Access 等
  2. 可能称为 DataAccess 的类在构造函数中接受您的提供程序类型:

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

每当您想创建命令或参数等时,您都可以使用工厂变量。

        DbCommand command = Factory.CreateCommand();
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = procedureName;
        command.Connection = connection;

如果您想要更具体的 Access 自定义代码,那么您需要使用继承模型,但我想 SQL 和 Access 有共同的语法,即相同的 SELECT、INSERT 命令等?

于 2013-04-17T09:44:18.207 回答