基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET平台开发指南 - 数据访问

简介:

统一数据访问介绍

         统一数据访问(Uniform Data Access,简写为UDA)用于隔离系统和数据平台,使系统可以在各种数据库平台上自由移植。该数据库访问接口要求通过该接口对数据库进行访问的模块要提交标准的SQL语句,而不仅仅是对当前数据库有效的语句。

         统一数据访问与数据层分离是相互相成的两个概念和实践、统一数据访问为数据层分离提供数据库访问环境及接口的独立、接口驱动及数据层体系结构的一致性提供保证。

         统一数据访问内部自动包装ADO.NET,具体使用何种数据库则在外部由系统管理员定义在配置文件中。统一数据访问接口内部提供对数据库连接对象、数据命令对象、事务对象等的管理,因此客户端不需要自己管理这些对象,只需要提交数据库命令即可。

         在UDA中主要的数据结构为“结果数据”。结果数据是数据库操作的结果的包装。如果是一个查询命令,则可能返回一个IDataReader对象、一个DataSet对象、一个DataTable对象、一个IDictionary对象、一个IList对象、一个数据对象(在数据对象管理中定义的数据结构)或者一个单纯的结果等,当然用户可以要求以XML的格式返回数据。

         AgileEAS.NET提供了IDataAccessor和IDataConntion两个接口:

wps_clip_image-21953

         IDataAccessor提供了对数据的操作:查询结果和执行SQL语句两种基本操作,同时提供了SQL批处理、代理查询和事务委托操作,而IDataConnetion相当于为IDataAccessor提供了一个数据库执行环境。

          数据访问器(IDataAccessor)是统一数据访问中进行数据存取的接口,他生存于数据库环境IDataAccessor之中,客户端只需通过该访问器提供的方法并为这些方法提供适当的参数进行数据库操作。访问器内部自动在当前数据库连接上创建数据库命令,并包装返回的结果。

         目前实现了SQL数据库(SQLServerConnection、SQLServerAccessor)、OleDb数据库(OleDbConnection、OleDbAccessor)、ODBC数据库(ODBCConnection、ODBCAccessor),ORACLE数据库由单独的数据库访问服务程序集实现。

详解Query和Execute

         上面简单的介绍了UDA及其中最主要的两个接口,在这两个接口中,IDataAccessor接口是负责数据操纵业务的,其中定义了最重要的两个重载方法Query和Execute。

         我们来看看Query的重载:

         /// <summary>

         /// 执行给定的数据库查询命令。

         /// </summary>

         /// <param name="commandString">要执行的命令语句。</param>

         /// <param name="commandType">要执行的命令的类型。</param>

         /// <param name="parameters">命令执行需要的参数。</param>

         /// <param name="resultType">调用方要求的返回结果的类型。</param>

         /// <returns>返回查询到的数据结果。</returns>

         object Query(string commandString, System.Data.CommandType commandType, ParameterCollection parameters, EAS.Data.Access.ResultType resultType);

         在AgileEAS.NET中Query针对不同的返回类型只提供一个方法,根据最后一个参数返回类型返回不同的的查询结果,于是产生一次装备操作,上层的调用者需要解决拆箱处理,下面看看返回类型:

         Default:默认。这种类型的结果一般用于返回单个查询值或者一个聚合值(比如 count、max等的值)。

         DataReader:返回一个 IDataReader对象。由于 IDataReader对象数据库的访问是面向连接的,而 Query 方法内部符合前面的IConnection操作模式,因此如果要返回一个 IDataReader,则必须在调用 Query 方法前打开相应的 IConnection,并在对IDataReader操作结束后关闭 IConnection,否则Query方法返回前会关闭 IConnection而导致 IDataReader不可用。可以使用DataReaderHandler委托解决这个问题。

         DataSet:返回一个 System.Data.DataSet对象。用于获取一个非面向连接的数据集合。

         DataTable:返回一个System.Data.DataTable对象。用于获取一个非面向连接的数据集合。

         Dictionary:返回一个 IDictionary接口集合对象。用于获取一个非面向连接的数据库记录。记录的字段映射到字典的键。

         List:返回一个 System.Collections.IList对象。用于获取一个非面向连接的数据库记录的集合,每一个记录只有一个字段。

         接着我们来看看Execute的重载:

         /// <summary>

         /// 执行指定的非查询命令。

         /// </summary>

         /// <param name="commandString">要执行的命令语句。</param>

         /// <param name="commandType">要执行的命令类型。</param>

         /// <param name="parameters">要执行的命令的参数集合。</param>

         /// <returns>返回命令影响的行数。</returns>

         int Execute(string commandString, System.Data.CommandType commandType, ParameterCollection parameters);

         Execute直接返回查询所影响的行数。

数据处理过程

         AgileEAS.NET平台在访问数据库时定了一个原则:IDataAccessor不得随意变更IDataConnetion的状态,我们知道在访问数据库时需要打开和关闭数据库操作,所以在IDataAccessor执行SQL命令过程上,首先判读IDataConnetion是否打开,如果未打开则执行IDataConnetion.Open()并在执行SQL完毕进行IDataConnetion.Close()。

         bool open = this.Connection.IsOpen;

         if(!open)

         this.Connection.Open();

         try

             {

                 //执行SQL

             }

         finally

             {

                  if(!open)

                           this.Connection.Close();

         }

委托查询

         而在执行查询命令时有一种返回结果IDataReader,这种状态需要数据库一直保持打开状态,所以我们增加了一个委托方法DelegateQuery,委托DataReaderHandler定义如下:

         /// <summary>

         /// 定义以DataReader作为结果返回时的数据访问委托。

         /// </summary>

         /// <remarks>

         /// 该委托的实例可以由Accessor.DelegateQuery方法在内部调用,这样委托实例就不需要考虑关闭DataReader的问题。

         /// </remarks>

         public delegate void DataReaderHandler(System.Data.IDataReader dataReader);

         程序员在开发过程中如果需要不处理数据库打开和关闭操作而需要返回IDataReader类型的处理结果,可以使用如下形式的处理:

         private void button3_Click(object sender, EventArgs e)

        {

         IDataAccessor dataAccessor = new OleDbConnection().CreateDataAccessor();;

            dataAccessor.DelegateQuery(new DataReaderHandler(LoadToUI), "SELECT * FROM Table1");

        }

         private void LoadToUI(IDataReader reader)

        {

         while (reader.Read())

            {

         // 业务代码

            }

   }

事务委托

         在数据库事务这一块,提供了除正常的开启事务、关闭事务之后,我更推荐一种事务委托和方式去执行,IDataAccessor提供了TransactionExecute方法,其委托TransactionHandler定义:

         /// <summary>

         /// 定义数据库操作的事务处理委托。该委托将代表客户执行数据库事务,这样使用者不需要考虑事务的开始和结束。

         /// </summary>

         public delegate int TransactionHandler(IDataAccessor Accessor);

         下面列一个例程:

         private void button3_Click(object sender, EventArgs e)

        {

                 IDataAccessor dataAccessor = new OleDbConnection().CreateDataAccessor();;           

                  dataAccessor.TransactionExecute(new TransactionHandler(SaveData));

        }

         private int SaveData(IDataAccessor accessor)

        {

                  int iAff = 0;

                     iAff+=accessor.Execute("...");

                           //

                     iAff += accessor.Execute("...");

                  return iAff;

        }

获取UDA对象

         UDA中的IDataConnection对象继承自EAS.Sessions.ISessionResource接口,也就是说UDA中的数据连接也是一种会话资源,可以通过取于上下文提供的会议中读取:

         //取当前会话连接

         IDataConnection dbcn = session.Resouces.FindResources(typeof(IDataConnection))[0] as IDataConnection;

         //访问器

         IDataAccessor dataAccessor = dataConnection.CreateDataAccessor();

         或者直接从上下文环境的IOC容器中直接获取:

         EAS.Objects.IContainer container = ContextHelper.Context.Container;

         //取数据连接

         IDataConnection dbcn = container.GetServiceComponentInstance(typeof(IDataConnection)) as IDataConnection;

         //访问器

         IDataAccessor dataAccessor = dataConnection.CreateDataAccessor();

         不同通过何种方式获取UDA对象,我们都无法在编程时预先知道他的具体实现,AgileEAS.NET平台实践着而向接口驱动的思想,UDA对象的具体实例类型写在配置文件中:

  <object name="MasterDataAccessor" assembly="EAS.Data" type="EAS.Data.Access.OleDbAccessor" LifestyleType="Singleton">

  <property name="Connection" type="object" value="MasterDbConnection" />

  </object>

  <object name="MasterDbConnection" assembly="EAS.Data" type="EAS.Data.Access.OleDbConnection" LifestyleType="Singleton">

  <property name="ConnectionString" type="string" value="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=sa;Initial Catalog=EAS;Data Source=vm2003" />

  </object>。

 

链接

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

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

     AgileEAS.NET官方网站

     敏捷软件工程实验室

 

QQ群:116773358


作者:魏琼东 
出处:http://www.cnblogs.com/eastjade
关于作者:有13年的软件从业经历,专注于中小软件企业软件开发过程研究,通过在技术与管理帮助中小软件企业实现技术层面开源节流的目的。熟悉需求分析、企业架构、项目管理。现主要从事基于AgileEAS.NET平台的技术咨询工作,主要服务于医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。如有问题或建议,请多多赐教! 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过mail.james@qq.com 联系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同讨论,非常感谢。


    本文转自魏琼东博客园博客,原文链接:http://www.cnblogs.com/eastjade/archive/2010/09/13/1824832.html,如需转载请自行联系原作者


相关文章
|
15天前
|
人工智能 开发框架 量子技术
【专栏】.NET 技术:驱动创新的力量
【4月更文挑战第29天】.NET技术,作为微软的开发框架,以其跨平台、开源和语言多样性驱动软件创新。它在云计算、AI/ML、混合现实等领域发挥关键作用,通过Azure、ML.NET等工具促进新兴技术发展。未来,.NET将涉足量子计算、微服务和无服务器计算,持续拓宽软件开发边界,成为创新的重要推动力。掌握.NET技术,对于开发者而言,意味着握有开启创新的钥匙。
|
15天前
|
开发框架 .NET C#
【专栏】理解.NET 技术,提升开发水平
【4月更文挑战第29天】本文介绍了.NET技术的核心概念和应用,包括其跨平台能力、性能优化、现代编程语言支持及Web开发等特性。文章强调了深入学习.NET技术、关注社区动态、实践经验及学习现代编程理念对提升开发水平的重要性。通过这些,开发者能更好地利用.NET构建高效、可维护的多平台应用。
|
15天前
|
机器学习/深度学习 vr&ar 开发者
【专栏】.NET 技术:引领开发新方向
【4月更文挑战第29天】本文探讨了.NET技术如何引领软件开发新方向,主要体现在三方面:1) 作为跨平台开发的先锋,.NET Core支持多操作系统和移动设备,借助.NET MAUI创建统一UI,适应物联网需求;2) 提升性能和开发者生产力,采用先进技术和优化策略,同时更新C#语言特性,提高代码效率和可维护性;3) 支持现代化应用架构,包括微服务、容器化,集成Kubernetes和ASP.NET Core,保障安全性。此外,.NET还不断探索AI、ML和AR/VR技术,为软件开发带来更多创新可能。
|
15天前
|
开发框架 Cloud Native 开发者
【专栏】剖析.NET 技术的核心竞争力
【4月更文挑战第29天】本文探讨了.NET框架在软件开发中的核心竞争力:1) .NET Core实现跨平台与云原生技术的融合,支持多操作系统和容器化;2) 提升性能和开发者生产力,采用JIT、AOT优化,提供C#新特性和Roslyn编译器平台;3) 支持现代化应用架构,包括微服务和容器化,内置安全机制;4) 丰富的生态系统和社区支持,拥有庞大的开发者社区和微软的持续投入。这些优势使.NET在竞争激烈的市场中保持领先地位。
|
15天前
|
开发框架 .NET 开发者
【专栏】领略.NET 技术的创新力量
【4月更文挑战第29天】.NET技术自ASP.NET起历经创新,现以.NET Core为核心,展现跨平台能力,提升性能与生产力,支持现代化应用架构。.NET Core使开发者能用同一代码库在不同操作系统上构建应用,扩展至移动和物联网领域。性能提升,C#新特性简化编程,Roslyn编译器优化代码。拥抱微服务、容器化,内置安全机制,支持OAuth等标准。未来.NET 6将引入更快性能、Hot Reload等功能,预示着.NET将持续引领软件开发潮流,为开发者创造更多机会。
|
15天前
|
物联网 vr&ar 开发者
【专栏】.NET 技术:为开发注入活力
【4月更文挑战第29天】本文探讨了.NET技术的创新,主要体现在三个方面:1) .NET Core实现跨平台开发革命,支持多种操作系统和硬件,如.NET MAUI用于多平台UI;2) 性能提升与生产力飞跃,C#新特性简化编程,JIT和AOT优化提升性能,Roslyn提供代码分析工具;3) 引领现代化应用架构,支持微服务、容器化,内置安全机制。未来,.NET 7将带来更多新特性和前沿技术整合,如量子计算、AI,持续推动软件开发创新。开发者掌握.NET技术将赢得竞争优势。
|
15天前
|
人工智能 前端开发 Cloud Native
【专栏】洞察.NET 技术的开发趋势
【4月更文挑战第29天】本文探讨了.NET技术的三大发展趋势:1) 跨平台与云原生技术融合,通过.NET Core支持轻量级、高性能应用,适应云计算和微服务;2) 人工智能与机器学习的集成,如ML.NET框架,使开发者能用C#构建AI模型;3) 引入现代化前端开发技术,如Blazor,实现前后端一致性。随着.NET 8等新版本的发布,期待更多创新技术如量子计算、AR/VR的融合,.NET将持续推动软件开发的创新与进步。
|
4月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
47 0
|
19天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
22 0
|
2月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
32 0