不同数据库的可配置数据访问层

时间:2013-04-17 09:17:31

标签: c# asp.net database data-access-layer

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

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

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

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

我想要实现的是为Model和DAL提供单独的层;当我从Page调用DAL方法时,它应该调用数据库类型。

模型

  • 员工
    • ID
    • 名称

DAL

  • EmployeeAccessDb(使用内联查询)

    • GETALL
    • GetByID
    • 插入
    • 更新
    • 删除
  • EmployeeSqlDb(使用存储过程)

    • GETALL
    • GetByID
    • 插入
    • 更新
    • 删除

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

1 个答案:

答案 0 :(得分:0)

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

  1. 需要一个代表不同提供者的枚举,即SQL,Access等
  2. 类可能称为DataAccess,它在构造函数中接受您的提供者类型:
  3. 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命令等?