OpenAccess基本操作

导读:本文以一个实例介绍OpenAccess如何对数据库中的表,做最基本的查询、添加、编辑、删除操作

为什么选择OpenAccess?

据我所知,.Net平台上的ORM框架主要有Entity Framework、Linq to Sql、OpenAccess、dotConnect、XPO几种,我在其中选择OpenAccess的首要原因在于根据Goolge上的搜索结果,OpenAccess比其他ORM优胜。

其次,Entity Framework的最新版已经不支持.Net Framework 3.5了,但OpenAccess仍然继续支持。因为我们公司的主流.Net开发工具是VS.Net 2008,这意味着OpenAccess是一个更为合适的选择。

最后,Entity Framework虽然得到了各大厂商的官方支持,但也有美中不足之处。以Oracle为例,Oracle在Oracle Data Access Component 11中增加了对Entity Framework的支持,但Oracle 11的客户端是不能连接9的数据库的。我们公司现时主要使用的数据库是Oracle 9i,这意味着OpenAccess是一个更为合适的选择。

另外,OpenAccess的开发商是Telerik,我们可以从这家公司的产品线上看到它的实力。

我想OpenAccess相对来说最大缺点莫过于没有中文版,纠结于英文的人可能比较适用使用Entity Framework。

创建本实例的先决条件

首先,从官方的下载网页,点击“Automatic Installation”下载OpenAccess。

http://www.telerik.com/account/your-products/product-versions.aspx?pid=639

这个页面是需要注册才能进入的,如果没有账号,要先注册一个。

其次,OpenAccess是通过调用Oracle.DataAccess.dll操作数据库的,所以需要下载并安装Oracle Data Access Component 10

http://download.oracle.com/otn/other/ole-oo4o/ODAC1020221.exe

  OpenAccess支持的数据库有很多,但由于我们公司现在使用的是Oracle数据库,所以本文主要针对的还是Oracle数据库。

本实例创建的步骤

在数据库中创建一个表

 C# Code
1

2

3

4

5

6

CREATE TABLE “Person”

(

“PersonId” CHAR(36) NOT NULL,

“PersonName” VARCHAR2(36) NOT NULL,

primary key (“PersonId”)

)

在VS.Net中创建解决方案。

在解决方案中添加“Telerik OpenAccess Class Library”项目。

在上图对应的操作窗口中点击“确定”后,将会弹出以下操作向导。

我这里直接填写连接字符串来连接数据库,也可以通过点击“Add New Connection”按钮来连接。

“Connection String Name”是程序的config文件中,configuration/connectionStrings节点下,存放连接字符串的add节点的name属性的值。

 XML Code
1

2

3

4

5

<configuration>

<connectionStrings>

<add name=“Model” connectionString=“Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.95)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=TEST)));User ID=TEST;Password=0;Enlist=false” providerName=“Oracle.DataAccess.Client”/>

</connectionStrings>

</configuration>

选择要生成的对象。

这里是生成的变量的命名规则,默认即可。

点击“Browser…”按钮,创建并选择“Generate”作为存放生成文件的目录。

在上图对应的操作窗口中点击“完成”后,打开EntitiesModel.rlinq,更改PersonId的类型为Guid。

更改Person的Identity Mechanism为Guid,大概意思是添加数据的时候,主键插入一个新的Guid。

更改Person的Concurrency Mode为None。

  Concurrency Mode是并发冲突的处理方式,处理并发冲突会增加编辑、删除数据时的性能负荷,我觉得绝大多数情况都不需要它。所以我建议把所有对象的Concurrency Mode都设成None,如果想了解更多关于“并发冲突”的概念,可以查阅网上相关资料。

最后在解决方案中,添加一个“Web Application应用程序”项目,并在项目中添加对Model项目的引用。

可能出现的问题

不知道是不是我机上只安装了Oracle Data Access Component,但没有安装Oracle客户端的原因,在OpenAccess的设计器中有时间会出现找不到Oracle.DataAccess的错误(程序中没有出现这个错误,仅限于设计器)。

解决方法是,如果在上述选择对象的界面中出现这个错误,点击“Next”跳过这一个步骤。

然后有点怪异的是,点击一下“Add OpenAccess Service…”这个问题就会消失了。

最后打开EntitiesModel.rlinq重新选择对象。

关于整个实例

本实例通过本文的附件下载,解决方案是VS.Net 2008格式。由于代码的注释都在源文件当中,这里就不重复叙述了。

实例中演示了对数据库中的Person表做最简单的查询(包括分页)、添加、编辑、删除操作。

Web项目中List.aspx是列表页面,包括查询、删除功能。Edit是编辑页面,包括添加和修改功能。

两个项目中都有一个.config文件,OpenAccess设计器在访问数据库的时候,读取的是Model项目中的config文件中的连接字符串所指向的数据库。但实际上程序运行的时候,OpenAccess读取的时候调用它的那个程序的config文件,即Web项目中的config文件。

要运行这个本实例,在数据库中建表后,修改config文件中的连接字符车即可。

关于数据类型的映射

在Sql Server数据库中,字段的每种数据类型在C#里都有明确对应的变量类型。但在Oracle当中,情况又不一样。例如Oracle建议统一使用Number作为数字类型,而不要使用Integer、Int等类型。Oracle的Number默认对应C#的类型是decimal,但更多时候,我们需要的是int。所以很多时候需要在设计器中更改属性的类型。

有鉴于此,在这里列出.Net和Oracle对应的数据类型作参考。

.NET

Oracle data types

System.Boolean NUMBER(1)
System.Byte NUMBER(3)
System.Byte[] BLOB
System.DateTime TIMESTAMP
System.DateTimeOffset TIMESTAMP WITH TIME ZONE
System.Decimal NUMBER
System.Double NUMBER
System.Guid CHAR(36)/RAW(16)
System.Int16 NUMBER(5)
System.Int32 NUMBER(10)
System.Int64 NUMBER(19)
System.SByte NUMBER(3)
System.Single NUMBER(15,5)
System.String VARCHAR2
System.TimeSpan INTERVAL DAY TO SECOND

下一篇日志,将讨论在实际中OpenAccess更多细节上的使用技巧。

本文附件:OpenAccessBasic

附件实际上是.zip文件,因为博客系统的限制,改成了doc,下载后改回zip扩展名即可打开。

Advertisements