《基于 ORM 模型的物资管理系统的设计和实现.doc》由会员分享,可在线阅读,更多相关《基于 ORM 模型的物资管理系统的设计和实现.doc(10页珍藏版)》请在三一文库上搜索。
1、豆丁网精品论文基于 ORM 模型的物资管理系统的设计和实现任钢 中国科学技术大学计算机科学技术系,合肥 (230027) E-mail:摘要:本文提出了一种基于.NET 平台的实现对象和关系数据库的转化的 ORM 模型。在 分析.NET 平台的数据库处理的技术基础上,本文设计了一个对象/关系数据库映射模式。并结合这个模式创建了一个通用的数据操作框架。该框架在揭阳供电局、汕头供电局和汕尾供 电局物资管理系统中给予了实现。关键词:物资管理系统;.NET 框架;对象关系映射 中图分类号:TP311.11引言物资管理是企业生产经营管理的重要环节,高水平的物资管理能够有助于提高企业效 益。通过这个系统,
2、公司能够很好地重组和管理物资资源,达到了企业减少成本,提高公 司生产效率和效益的目的。本文基于.NET平台的ORM技术的揭阳供电局、汕头供电局和汕 尾供电局物资管理系统进行深入的研究,并提出设计方案和实现过程。2关键技术2.1 NET框架1.NET Framework 是微软推出的新一代的计算平台,其作用是建立一个可以快速构建 Web 应用、建立网络应用程序的计算平台。.NET 框架由公共语言运行时(CLR)、共享对象 类库和 ASP.NET 三部分组成。2.2 ASP.NET2ASP.NET 是一项功能强大的新技术,它用于编写动态 Web 页。ASPNET 建立在NET Framework
3、类的基础之上,并提供了由控件和基础部分组成的“Web 程序模板”,大大简化了 Web 程序和 XML Web 服务的开发。程序员直接面对的是一组 ASPNET 控件,而这些控 件由一些诸如文本框、下拉选单等通用的 HTML 用户界面构件封装而成。实际上,这些控 件运行于 Web 服务器上,并以 HTML 的形式将用户界面发送到浏览器。ASP.NET 程序可用 多种语言开发,本系统采用 C#3语言编写。2.3 ADO.NET4ADO.NET 是微软提供的一种高性能访问数据源的策略,运用 ADO.NET 能够编写对数 据库服务器中的数据进行访问和操作的应用程序,并且易于使用、高效、低内存支出和占用
4、 磁盘空间较少,支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。ADO.NET 技术是一个基于标准的、面向创建的、分布式数据共享应用程序的编程模型。ADO.NET 主要包 含四 个主要专业组件( Connection 、 Command 、 DataReader 和DataAdapter)和一个综合的组件 DataSet。其.NET 数据访问架构如图 1 所示。图 1 .NET 数据访问架构2.4对象关系映射模式(ORM模式)对象关系映射模式(ORM 模式),即 Object-Relational Mapping,是把对象模型表示 的对象映射到基于 SQL 的关系模型结构中去,
5、同时支持对象到关系数据库表的持久化。本 质上,ORM 是将数据从一种数据格式转换为另一种数据格式,将对象映像到某种持久机制 并且对关系数据库结构的简单改动并不影响面向对象代码的一个健壮的持久层。它的作用是 在关系型数据库和对象之间作一个映射,实现类与数据库表的映射,做到真正的数据库与业 务层的无关。3 总体设计和实现3.1 系统设计核心但是目前数据存储都是存放在关系数据库,面向对象和面向关系这两种技术在设计思想 以及操作上截然不同:对象由数据和行为组成,而关系型数据库则是由表和它们之间的关系 组成的。因此一个完善的持久化方案需要关注如下问题5: 将关系数据库的关系模式模型转 化为对象模型; 对
6、象模型的业务处理转化为关系数据库的 SQL 处理。 提供查询机制, 能从关系数据库中的行列数据转化为对象;。 有一个接口或管理者来实现并发控制、事务 等方面的管理。C#是开发.NET 应用程序的一种面向对象语言。在用 C#开发程序时就要求在面向对象和面向关系之间进行切换。在.NET 框架中对数据库的访问,由于数据源的不同而产生不同的 Connection、DataAdapter、Command、Parameter 对象。所以,创建一个.NET 平台持久化方 案,一方面要实现对象与关系数据库的映射,另一方面要从.NET 框架的特殊情况,形成一 个通用的数据操作模式,支持这种对象/关系映射的实现。
7、图 2 是通用数据操作框架的类图 模型:ITransaction+ TransCount : intIExecuteSqlICreateSqlObject+BeginTransaction ()+CommitTransaction (): void: void+ ExecuteDataSet (DataSet _DataS+ ExecuteNonQuery (IDbCommand _+RollbackTransaction () : void+ ExecuteReader (IDbCommand _id+ CreateConnection (): IDbConnection+ get_Tran
8、sCount (): int+ ExecuteScalar (IDbCommand _idbC+ CreateDataAdapter () : IDbDataAdapter+ ExecuteUpdate (DataSet _DataSeDbProviderType+ CreateCommand ()+ CreateParameter (): IDbCommand: IDbDataParameter+ Unknown: int+ SQLSERVER : intDataHelper-Helper: IDbContextIDbContext+ ConnectionString : string+ O
9、LEDB+ ODBC+ ORACLE: int: int: int+ ConnectionString : string+ Connection: IDbConnection+ Connection: IDbConnection+ DbProviderType : DbProviderTypHelper+ DbProviderType : DbProviderTypem_DbProviderType+ TransCount: int+ get_ConnectionString () : string+ get_Connection (): IDbConnection+ DataHelper (
10、)+ get_DbProviderType () : DbProviderTypeDbContextHelper+ Gget_ConnectionString () : stringIDbCm_objdatahelper-m_Provider: C-m_Command: I- Provider: ID-m_ConnectionString : st+ ConnectionString: stIDataAccessProvider+ ConnectionString : str+ get_ConnectionString ()m_Provider-m_DbProviderType : D DDa
11、taHelperProvider-m_objdatahelper+ DataHelperObject- DataHelperProv+CreateConnection ()+CreateDataAdapter ()+CreateCommand ()+ get_DataHelpeOleDbDataAccessProvider-m_ConnectionStrSqlServerDataAccessProvider-m_ConnectionString : s+ ConnectionString+ OleDbDataAc+ ConnectionString : s+ SqlServerDataAcce
12、sOracleDataAccessProvider-m_ConnectionString : strin+ get_ConnectiCreateConnec+ + + get_ConnectionStrinCreateConnection () CreateDataAdapter ()+ ConnectionString: strin+ CreateCommand ()+ OracleDataAccessProv+ + + + get_ConnectionString () CreateConnection () CreateDataAdapter () CreateCommand ()图 2
13、 通用数据操作框架类图模型C#的数据操作主要是三类: 创建数据处理对象,包括 Connection、DataAdapter、 Command 和 Parameter 。 事务处理,包括 BeginTransaction 、 CommitTransaction 、 RollbackTransaction。 数据查询,包括 ExecuteDataSet、ExecuteNonQuery、ExecuteReader 和 ExecuteScalar。编写三个数据操作接口,分别针对上面三种情况。ICreateSqlObject、 ITransaction 、 IExecuteSql 。然 后 IDbCon
14、text 继承这三个接口。编写一个实现 类 DbContextHelper 继承 IDbContext 接口并实现其方法。这样,在 DbContextHelper 类中,就 包括这些内容:-m_Command- ProviderDbContextHelper: IDbCommand: IDataAccessProvider= null+ ConnectionString : string+ DbProviderType+ Connection+ Transaction+ RollbackFlag+ TransCount: DbProviderType: IDbConnection: IDbTr
15、ansaction: bool: int+ ExecuteDataSet (DataSet _DataSet, string _TableName, IDb+ ExecuteNonQuery (IDbCommand _idbCommand)+ ExecuteReader (IDbCommand _idbCommand, CommandBeh+ ExecuteScalar (IDbCommand _idbCommand)+ ExecuteUpdate (DataSet _DataSet, IDbDataAdapter _IDbD+ CreateConnection ()+ CreateDataA
16、dapter ()+ CreateCommand ()+ CreateParameter ()-OleDbDataAccessProvider m_ConnectionString : string-ConfigNewConnection ()+ ConnectionString: string-ConfigNewTransaction ()+ OleDbDataAccessProvider (string AConnectionString)+Init ()+Clearup (bool canCloseConnection)+Clearup ()+EnterContext (IDbComma
17、nd _idbCommand)+EnterContext (IDbDataAdapter _IDbDataAdaper)+ BeginTransaction ()+ CommitTransaction ()+ RollbackTransaction ()-Clear ()+ + + + + + get_ConnectionString () CreateConnection () CreateDataAdapter () CreateCommand () CreateParameter ()CreateParameter (string parameterName, DbType dataCr
18、eateParameter (string parameterName, object paramCreateCommandBuilder (IDbDataAdapter ADataAdapte图 3 DbContextHelper 类属性和方法图 4 OleDbDataAccessProvider 类属性和方法对于数据源类型,编写一个数据访问接口,IDataAccessProvider 。增加三个实现类 OracleDataAccessProvider、SqlServerDataAccessProvider 和 OleDbDataAccessProvider,分别 针对 Oracle 数据库
19、、SQL Server 数据库和 OLE.DB 数据库的实现。当处理不同的数据源时, 返回不同的 Connection、DataAdapter、Command 和 Parameter。其中 OleDbDataAccessProvider 实现类如图 4 所示。对于 VO 对象与 SQL 的转化,通过一个类 SqlBuilder 来处理。在所有的 VO 对象中都 有一个 SqlBuilder 属性。当对 VO 对象进行操作时,这些属性变化都已经加载到了该对象的 SqlBuilder 属性 中 。当执 行 SqlBuilder 的 ToDeleteCommand 、 ToInsertCommand
20、 、 ToSelectCommand、ToUpdateCommand,根据这些属性的变化,把对象属性转化为 Delete、 Insert、Select、Update 的 SQL 语句。在转化的过程中,包括对象的检索条件和传递的参数。 SqlBuilder 类是一个面向.Net Framework 环境的对象/关系数据库映射类。对象/关系数据库映 射用来把对象模型表示的对象映射到基于 SQL 的关系语言中去。DbContextHelper 提供数据 提交、数据查询和获取数据的方法,可以大幅度减少开发时人工使用 SQL 和 Connection、 DbDataAdapter、DbCommand、D
21、bParameter 等专有处理对象的时间。图 5 是 SqlBuilder 类 基本属性和方法。+ TableName : stringSqlBuilder+ Fields: Hashtable+ SqlBuilder ()+ SqlBuilder (string tableName)+ + + +get_TableName () set_TableName (string value) get_Fields ()ToString ()Append (Field _field) ToInsertCommand () ToDeleteCommand () ToUpdateCommand ():
22、 string: void: Hashtable: string: SqlBuilder: IDbCommand: IDbCommand: IDbCommand+ToSelectCommand (DataHelper objDataHelper) : IDbCommand图 5 SqlBuilder 类基本属性和方法实现过程是 DataHelper 作为 DbContextHelper 的管理类,类似于工厂模式。由 DataHelper创建出 DbContextHelper 实例化对象。主要的处理方法都是由 DbContextHelper 来实现,包括 ExecuteDataSet、Execu
23、teNonQuery、ExecuteReader、ExecuteScalar、ExecuteUpdate。如图6 所示:Ole:OleDbDataAccessProviderOracle:OracleDataAccessProviderSql:SqlServerDataAccessProviderBuilder:SqlBuilder31: Implement32: Implement10: Create50: Execute33: ImplementSqlHelper:DataHelper20: CreateContextContentHelper:DbContextHelper 30: Cr
24、eateDataAcce DataAccess:IDataAccessProvide40: ImplementDbContext:IDbContext41: ImplementTransac tion:ITransac tion42: Implement 43: ImplementCreateSqlObject:ICreateSqlObjec tssObject_6:IExecuteSql图 6 ORM 数据访问框架实现过程在实例化 DbContextHelper 的同时把数据源类型参数传递进去,返回当前的数据源类型 接口 ,这个接口通过 OracleDataAccessProvider 、
25、SqlServerDataAccessProvider 和 OleDbDataAccessProvider 类中的一种去实现。这样,根据 C#的数据访问模式,在相应的 Provider 生成出相应的 Connection、DbDataAdapter、DbCommand、DbParameter 等。比如, OleDbDataAccessProvider 就生成 OleDbConnection、OleDbDataAdapter、OleDbCommand、 OleDbParameter。3.2 系统总体结构采用多层结构应用模式,包括以下 4 个层次(见图 7):表示层、业务逻辑层、持久层 和数据层。
26、对于 B/S 应用系统来说,在这 4 个层次中,系统的主要功能和业务逻辑在业务 逻辑层进行处理。图 7 表现了业务逻辑层和数据层及表示层的关系。图 7 物资管理系统多层结构应用模式3.2.1 表示层在表示层中,.NET 是由 ASP.NET Web Forms 来实现的。Web Forms 是基于服务器端的 动态页面技术,服务器端可以根据客户端的请求和提交的信息,动态地生成与客户端浏览器 类型无关的通用 HTML 页面,也可以根据客户端浏览器类型,生成特定的数据表现形式。 Web Forms 控件负责生成用户接口,它提出了一种将应用程序代码和用户接口内容分离的更 加结构化的方法,使 ASP.N
27、ET 网页能动态地编译到受控类中,用以提高性能。每个引入的 HTTP 请求都被传递到一个新的网页实例。3.2.2 业务逻辑层 业务逻辑层也叫事务逻辑层或中间层。这一层包括业务管理层和数据访问层。业务服务子层主要处理一些业务逻辑和业务规则。首先是用表现层获取信息,然后针对获得的数据,进行业务处理,转化为持久对象,提交到通用数据操作层。3.2.3 持久层把关系数据映射为 VO(Value Object)对象。直接对 VO 对象进行操作。由 VO 属性的 SqlBuilder 把 VO 转化为关系数据库的 SQL,通过通用数据操作类 DataHelper 完成对数据库 的操作。DataHelper
28、主要解决如何从数据库中提取和保存数据,并支持并发和事务管理。3.2.4 数据层数据层就是 EIS 内容,主要是数据库管理系统。VO 作为一个数据传输对象在各个层次间传递信息和数据。这样,在开发过程中开发人 员不用了解知道这些数据具体是如何进行操作的极大地降低了软件体系中各个功能部件的 耦合性,提高了软件的可重用性、可伸缩性、灵活性和可扩展性。3.3 系统的功能模块物资管理系统的功能模块包括基本资料管理、计划管理、采购管理、仓库管理、领料管 理、库存管理、综合查询分析、系统管理等,见图 8。3.4 系统实现3.4.1 数据处理模式实现图图 8 物资管理系统功能模块通过 O/R 映射的实现过程,其
29、中数据修改和提交实现模式见图 9,数据查询实现模式见 图 10。图 9 数据修改和提交实现模式图 10 数据查询实现模式3.4.2 数据处理模式实现例子代码 现在就一个物资编码类的实现过程,展示程序代码的实现: MaterialClass 实体类定义:public class MaterialClass/region 私有变量申明和初始化private string strC_nativeID=string.Empty;private string strC_parentID = string.Empty;. /具体私有变量申明和初始化,此处省略private SqlBuilder objSq
30、lBuilder = new SqlBuilder(MM_CLASS);private bool boolAppendToSqlBuilderFlag = true ;/ MaterialClass 类构造函数public MaterialClass(string _c_nativeID)strC_nativeID = _c_nativeID;if (boolAppendToSqlBuilderFlag)objSqlBuilder.Append(C_NATIVEID,strC_nativeID,DbType.AnsiString ,true) ; / C_NativeID 属性(物资类别内部编
31、码)public string C_NativeIDget return strC_nativeID; setif (strC_nativeID !=value | value=string.Empty) strC_nativeID = value;if (boolAppendToSqlBuilderFlag)objSqlBuilder.Append(C_NATIVEID,strC_nativeID,DbType.AnsiString,true) ;/具体属性申明和初始化,此处省略/ 获取对象内部的 SqlBuilder 对象,可用来生成 T-SQL 语句或 Command 对象。intern
32、al SqlBuilder SqlBuildergetreturn objSqlBuilder;/ 设置当给对象属性赋值时是否同时追加信息到 SqlBuilder 对象中的标志位。internal bool AppendToSqlBuilderFlag set boolAppendToSqlBuilderFlag = value;MaterialClass 管理类定义,包括初始化、选择、增加、修改和删除方法:public class MaterialClassManager/ 实例化 MaterialClass 类,并根据部门的 ID 从数据库获得 MaterialClass 对象public
33、 static MaterialClass CreateInstance(string _c_NativeID) DataHelper objDataHelper = new DataHelper(); StringBuilder objStrBuilder = new StringBuilder();DataSet ds= new DataSet();objStrBuilder.Append Append(Select * from MM_CLASS where C_NATIVEID = );objStrBuilder.Append(_c_NativeID.ToString().Append
34、();try objDataHelper.ExecuteDataSet(ds,objStrBuilder.ToString(); if (ds.Tables0.Rows.Count = 0 )throw new NonexistentDataException(无法实例化此 ID 的 MaterialClass 对象);elseMaterialClass objMaterialClass = new MaterialClass(); DataRow dr = ds.Tables0.Rows0;/给 objMaterialClass 对象赋属性时禁止追加相关值到 SqlBuilder 对象中。o
35、bjMaterialClass.AppendToSqlBuilderFlag = false;/给 objMaterialClass 对象的属性赋值objMaterialClass.C_NativeID = _c_NativeID;/具体对象的属性赋值,此处省略return objMaterialClass;catch(NonexistentDataException e) throw e;catch (Exception e) throw new ApplicationException(e.ToString(); / 添加一个 MaterialClass 对象到数据库public stat
36、ic void Add(MaterialClass _objMaterialClass) DataHelper objDataHelper = new DataHelper();try objDataHelper.ExecuteNonQuery(_objMaterialClass.SqlBuilder.ToInsertCommand();return;catch (Exception e) throw new ApplicationException(e.ToString(); / 从数据库删除一个 MaterialClass 对象public static void Delete(Mater
37、ialClass _objMaterialClass) DataHelper objDataHelper = new DataHelper();tryobjDataHelper.ExecuteNonQuery(_objMaterialClass.SqlBuilder.ToDeleteCommand();return;catch(Exception e) throw new ApplicationException(e.ToString(); / 从数据库中修改一个 MaterialClass 对象public static void Update(MaterialClass _objMater
38、ialClass) DataHelper objDataHelper = new DataHelper();IDbCommand command =objDataHelper.CreateCommand();trycommand = _objMaterialClass.SqlBuilder.ToUpdateCommand();if (objDataHelper.ExecuteNonQuery(command) =0)throw new ApplicationException(未更新任何数据);return;catch(Exception e) throw new ApplicationExc
39、eption(e.ToString();4. 结束语物资管理是供电局物流工作的核心和关键环节。本文利用.NET Framework 技术以其动 态、高效、简洁、与平台无关等特点对 Web 应用的开发。提出了基于.NET Framework 平台 的 ORM 技术思想和思路,对系统的结构和功能进行了设计和开发,实践证明:使用 ORM 开发应用系统,不仅可以提高程序的可维护性,也使开发工作变得更加灵活、方便,更适用 于大型系统的团队开发,大大提高了编程的效率。参考文献1 Maro Bellinaso. ASP. NET Web 站点高级编程M . 北京:清华大学出版社,2002。2 Robert
40、Lair,Jason Lefebvre,ASP.NET 开发人员手册,张俊,何长松,北京电子工业出版社,2002,8-10 3 微软公司,C#语言参考手册,裴剑峰,北京:清华大学出版社,2001,344 Rebecca Riordan,ADO.NET 程序设计,李高健,孙瑛霖,北京:清华大学出版社,2002,23-255 徐长盛 戴超 谢立,J2EE 数据持久化技术的研究,计算机应用与软件,2006. 4(56-57,75)The Application and Design of the Material InformationSystem Based on ORM in the .NET FrameworkRen GangDepartment of Computer Science and Technology,University of Science and Technology ofChina,HeFei (230027)AbstractThe article bring forward ORM Model which map between Object and RDS ( Relation D