• 一步一步教你使用AgileEAS.NET基础类库进行应用开发基础篇UDA中的委托与应用


    上文回顾

          上一篇文章基于AgileEAS.NET平台基础类库进行应用开发-使用UDA操纵SQL语句一文中演示如何使用UDA进行常规的业务进行操作,我们看到两种数据操纵流程,一种是原始的操作流程,另一种是简化的数据操作流程,应用开发人员不用关心数据库的打开与关闭,这些工作由UDA为我们完成,我们只需要实现与业务相关代码即可。

    问题引出

           我们现在再看一眼我们在前面提供的数据处理流程:

    image
            AgileEAS.NET平台提供两种数据处理流程供我们选择,两种方式的差别在于应用开发人员是否控制连接的打开与关闭,第一种方式应用开发人员管理连接的打开与关闭,我们称为他原生的数据访问方式,第二种方式是数据库的打开与关闭由UDA对象自动控件,我们称他为懒惰方式吧,在执行SQL之前由UDA打开连接,执行完SQL之后由UDA关闭连接,也就是说在Quer和Execute方法中,包含了数据库的打开与关闭操作。

            在基于AgileEAS.NET平台的应用开发中,我们推荐第二种方式,但同时一个问题来了,Query方法在执行完SQL语句之后关闭了连接,对于IDataReader这种必须要连接在线的返回类型则第二种方式无法支持,同时,对于事务处理,一个事务中包含多条语句,第二种方式的自动打开与关闭连接不能支持事务处理。

    如何解决

            鉴于上面的问题,我们提供了两种解决方法,第一、使用原生模式处理数据访问,当然这是我们不推荐的,第二、UDA的IDataAccessor中提供了两个委托方法DelegateQuery、TransactionExecute及其相关的重载,DelegateQuery实现DataReader访问方式的委托查询,TransactionExecute实现事务委托,有关于这两个委托方法及其delegate定义请参考AgileEAS.NET之统一数据访问一文及AgileEAS.NET基础类库参考手册

    委托查询例子

             现在我们来使用委托查询修改上文中IDataReader查询的例子,先贴上原生方式的IDataReader查询:

        /// <summary>
        /// 演示使用IDataReader。
        /// </summary>
        /// <remarks>
        /// IDataReader返回类型必须要求数据库打开,也就是说手工管理连接的打开。
        /// </remarks>
        public void DemeGetDataReader()
        {
            IDataAccessor accessor = UdaContext.DataAccessor;
    
            accessor.DataConnection.Open();
    
            try
            {
                IDataReader reader = null;
                try
                {
                    reader = accessor.QueryDataReader("Select top 30 * from dbo.product");
                    //reader = (IDataReader)accessor.Query("Select top 30 from dbo.product",
                     ResultType.DataReader);  //等效
    
                    while (reader.Read())
                    {
                        int count = reader.FieldCount;
                        for (int i = 0; i < count; i++)
                        {
                            System.Console.Write(string.Format("{0}={1}\t", reader.GetName(i), 
                            reader.IsDBNull(i) ? "null" : reader.GetValue(i)));
                        }
                        System.Console.Write("\n");
                    }
                }
                finally
                {
                    if (reader != null && !reader.IsClosed)
                        reader.Close();
                }
            }
            finally
            {
                accessor.DataConnection.Close();
            }
        }

             下面我们来使用DelegateQuery改造这个方法:

        /// <summary>
        /// 演示代理查询。
        /// </summary>
        public void DemeDelegateQuery()
        {
            IDataAccessor accessor = UdaContext.DataAccessor;
            accessor.DelegateQuery(new DataReaderHandler(this.InternalGetDataReader), 
            "Select top 30 * from dbo.product");
        }
    
        /// <summary>
        /// 代理方法。
        /// </summary>
        /// <param name="reader"></param>
        void InternalGetDataReader(IDataReader reader)
        {
            while (reader.Read())
            {
                int count = reader.FieldCount;
                for (int i = 0; i < count; i++)
                {
                    System.Console.Write(string.Format("{0}={1}\t", reader.GetName(i), 
                    reader.IsDBNull(i) ? "null" : reader.GetValue(i)));
                }
                System.Console.Write("\n");
            }
        }
                  是不是这种方法感觉很简洁。

              有关本例子所涉及的数据表结构请参考基于AgileEAS.NET平台基础类库进行应用开发-总体说明及数据定义一文,有关数据对象模型定义文件、文档、DDL脚本请下载:https://files.cnblogs.com/eastjade/demo.db.doc.sql.rar,本文代码下载:UDA.Demo2.rar

    链接

    AgileEAS.NET平台开发指南-系列目录

    AgileEAS.NET应用开发平台介绍-文章索引

    一步一步教你使用AgileEAS.NET基础类库进行应用开发-系列目录

    AgileEAS.NET平台应用开发教程-案例计划

    AgileEAS.NET官方网站

    敏捷软件工程实验室

    QQ群:116773358

  • 相关阅读:
    udp和tcp
    以查询代替临时变量
    memcached内存管理
    设计模式适配器模式
    排序算法
    防止表单重复提交
    php的引用
    按位与,按位异或,按位取反
    git常用操作
    http
  • 原文地址:https://www.cnblogs.com/eastjade/p/1831450.html
Copyright © 2020-2023  润新知