zoukankan      html  css  js  c++  java
  • 通用性站点管理后台(Bee OPOA Platform) (4) DAL

    该篇将介绍一下该平台中数据库访问层。设计之初考虑的主要偏向于方便应用, 由此数据访问层支持

    1. 简单, 方便, 高效。 API简单高效。

    2. 支持嵌套调用。 DbSession.Current

    3. 通用。 支持主流数据库应用。 已使用验证过的包括Sqlite, SqlServer2008, SqlServer2005, Oracle。

    DbSession的介绍

    先来看一下DbSession的主要API。

       /* 实现IDisposable接口, 推荐使用using方式*/
        public sealed class DbSession : IDisposable
        {
            public DbSession(string connectionName) { /*使用配置文件中的连接名, 默认不启用事务*/ }
            public DbSession(string connectionName, bool useTransaction) {/*使用配置文件中的连接名, 是否启用事务*/  }
    
            /// <summary>
            /// 手动注册连接字符串。
            /// </summary>
            public static void Register(string connectionName,
                string providerName, string connectionString) { }
    
            public int CommandTimeout { get; set; }/* 该实例调用的超时时间*/
    
            public static DbSession Current
            {
                get; /* 获取当前上下文中DbSession实例, 不跨线程。 若上下文中未声明过, 则使用配置文件中第一个连接。*/
            }
    
            public void CommitTransaction()
            {
                /* 提交事务, 若不执行, 则自动rollback。 若中途抛异常, 自动rollback。*/
            }
    
            public int Insert(string tableName, BeeDataAdapter dataAdapter)
            {
                /* 指定表名, 插入数据集。 若不是该表中的字段, 则自动忽略。*/
            }
    
            public void Update(string tableName, BeeDataAdapter dataAdapter, SqlCriteria sqlCriteria)
            {
                /*指定表名, 数据集, 及条件集, 更新表*/
            }
    
            public void Delete(string tableName, SqlCriteria sqlCriteria)
            {
                /*指定表名, 及条件集, 删除数据*/
            }
    
            public DataTable Query(string tableName, SqlCriteria sqlCriteria) { }
            public DataTable Query(string tableName, SqlCriteria sqlCriteria, string orderbyClause) { }
            public DataTable Query(string tableName, string selectClause,
                SqlCriteria sqlCriteria, string orderbyClause, int pageIndex, int pageSize, ref int recordCount) { }
    
            public DataTable ExecuteCommand(string cmdText, BeeDataAdapter dataAdapter) { }
            public List<T> ExecuteCommand<T>(string cmdText, BeeDataAdapter dataAdapter){}
    
            public int Insert<T>(T value) { }
            public void Delete<T>(SqlCriteria sqlCriteria) { }
            public int Save<T>(T value) { }
            public List<T> Query<T>() { }
            public List<T> Query<T>(SqlCriteria sqlCriteria) { }
            public List<T> Query<T>(SqlCriteria sqlCriteria, string orderbyClause,
                int pageIndex, int pageSize, ref int recordCount) { }
    
            public DataTable CallSP(string spName, BeeDataAdapter dataAdapter)
            {
                /*调用存储过程。 若数据中的参数不是该存储过程的参数, 则自动忽略。 请注意存储过程的参数列表被缓存。 */
            }
    
            #region Schema Access
    
            /// <summary>
            /// 获取所有Table, SP, View
            /// </summary>
            public List<DbObject> GetDbObject() { }
    
            public TableSchema GetTableSchema(string tableName) { }
            public SPSchema GetSpSchema(string spName) { }
    
            /// <summary>
            /// 根据表结构, 获取创建表sql
            /// </summary>
            public string ToCreateTableScript(TableSchema tableSchema) { }
    
            /// <summary>
            /// 通过类型获取表结构
            /// </summary>
            public TableSchema GetEntitySchema(Type type) { }
    
            #endregion
        }

    接口定义中, 大部分日常操作都能满足。 该接口同时可以满足获取DataTable及Orm方式。

    DbSesion的嵌套调用

    嵌套应用还是比较常用的, 尤其是在分层系统应用中。 很多底层方法都是完成特定功能的, 如获取单据号。 如下方法:

            public string GetBillId(string billType)
            {
                string result = string.Empty;
    
                BillTypeConfig billTypeConfig = null;
    
                DbSession dbSession = DbSession.Current;
    
                DateTime dateTime = DateTime.Today;
    
                string billDate = ""; // 当期, 如20121225, 201212.
                billTypeConfig = dbSession.Query<BillTypeConfig>(
                    SqlCriteria.New.Equal("billtype", billType).Equal("billdate", billDate)).FirstOrDefault();
    
                if (billTypeConfig == null)
                {
                    billTypeConfig = new BillTypeConfig();
                    billTypeConfig.BillType = billType;
                    billTypeConfig.BillDate = billDate;
                    billTypeConfig.LastId = 1;
                }
                else
                {
                    billTypeConfig.LastId = billTypeConfig.LastId + 1;
                }
    
                dbSession.Save(billTypeConfig);
    
                // 拼凑单据号
    
                return result;
            }

    如没有上述代码中红色标注这一句, 一般实现要不就不管事务, 要不就需要将当前的访问数据库的上下文作为变量传进来。 若用DbSession.Current处理该类情况, 则十分的优雅, 该方法会自动根据调用方的连接走, 无论是换个连接, 还是是否启用事务。

    简单ORM实现

    所有的泛型QueryAPI其实都是先获取了DataTable后, 再进行ORM映射的。 之间的转换也是通过Emit动态生成接口(一个接口的实现)实现的。

  • 相关阅读:
    ♫【网站优化】
    ☀【html】锚点
    ↗☻【PHP与MySQL动态网站开发(第4版本) #BOOK#】第1章 PHP概述
    _#【jQuery插件】Carousel 传送带
    _#【jQuery插件】Autocomplete 自动补全
    【兼容】ie6 hover
    【兼容】ie6/ie7 overflow:hidden;失效
    Online Mono for Android training now available in Spanish
    MonoDevelop 3.0.4 发布啦!
    猴子选大王的四种VB解法
  • 原文地址:https://www.cnblogs.com/hkf7703/p/2832482.html
Copyright © 2011-2022 走看看