分享
 
 
 

SmartPersistenceLayer 2.0(2)-- 基础设置篇

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

SmartPersistenceLayer 2.0 之基础设置篇

现在我要讲一下,SPL在系统中应该如何应用,通过本篇,你将会学会如何配置SPL到你的系统中。

SPL运行原理

SPL作为一个数据访问平台,最终以DLL的方式体现,那么系统只要引用SPL的DLL就可以开始应用了。

SPL将依赖于两个XML配置文件:数据源配置文件(以下我称之为DatabaseMap.xml)和实体映射文件(以下称之为ClassMap.xml)。这两个配置文件在整个系统运行时,将一次性载入到内存,这样可以提高SPL的运行效率,所以如果这两个配置文件修改了,要IISReset或是重编译才能见到效果。

DatabaseMap.xml

databaseMap.xml是数据源配置文件,在这里配置系统运行的数据库连接,目前支持三种数据源(SQL Server,Oracle,Access),可以在这个文件中配置多个多种数据源,下面举个例子:

<?xml version="1.0" encoding="utf-8"?><map>

<!-- SQL Server服务器配置 -->

<database name="SQL" type="MsSqlServer">

<parameter name="Provider" value="SQLOLEDB.1" />

<parameter name="Password" value="" />

<parameter name="Initial Catalog" value="northwind" />

<parameter name="User ID" value="sa" />

<parameter name="Data Source" value="localhost" />

<classMapFile path="ClassMap1.xml" />

</database>

<!-- SQL Server服务器配置 -->

<database name="ACCESS" type="MsAccess">

<parameter name="Provider" value=" Microsoft.Jet.OLEDB.4.0" />

<parameter name="Data Source" value=" D:\pl\Test\test.mdb" />

<classMapFile path="ClassMap2.xml" />

</database>

<!-- SQL Server服务器配置 -->

<database name="ORACLE" type="Oracle">

<parameter name="Provider" value="MSDAORA.1" />

<parameter name="Password" value="password" />

<parameter name="User ID" value="user" />

<parameter name="Data Source" value="host.domain.com" />

<classMapFile path="ClassMap3.xml" />

</database>

</map>

以上列举了三种数据库的配置信息,其中:

database 的name是指在SPL中要使用的数据源名,这个值要能唯一标识一个连接,这样在SPL中可以直接使用name就可以执行操作了.

database的type有三种:MsSqlServer是指SQL数据库

MsAccess是指Access数据库

Oracle是指ORACLE数据库

parameter是连接中要用到的各个参数,这根据不同的数据源类型会有不同的值,具体的参照上面的写法就可以了.

如果要扩展参数,可以直接添加parameter,因为SPL中从parameter中读取[值对]组装成连接字符串的.

每个连接源上都有一个 <classMapFile path="ClassMap.xml" />是指定这个数据源对应的表与实体的映射信息,可以采用与databaseMap的相对路径指定,也可以指定为绝对路径,下面解释一下ClassMap.xml中的内容.

ClassMap.xml

ClassMap.xml是实体与表的映射关系,我以一个典型的例子要做解释,比如目前有个表为学生表Student,有字段:

Id 序号 Int pk 自动增长

No 学号 Varchar(40) pk

Name 姓名 Varchar(40)

Birthday 出生日期 Datatime

Grade 年级 Int

Score 入学成绩 decimal

那么对应的映射信息为:

<class name="StudentEntity" table="Student" database="MyDB">

<attribute name="Id" column="Id" type="Integer" increment="true" key="primary" />

<attribute name="No" column="No" type="String" key="primary" />

<attribute name="Name" column= StudentEntity "Name" type="String" />

<attribute name="Birthday" column="Birthday" type="Date" />

<attribute name="Grade" column="Grade" type="Integer" />

<attribute name="Score" column="Score" type="Decimal" />

</class>

从以上的配置我们很容易理解:

class 的name是指实体名,这要与实体类的名称相同

table是指映射的数据库是的表名;

database是指定实体默认的数据库源,对应databaseMap.xml的配置;

IsSaveToMemory为可选配置,如果此表为维护性数据,具有字段少,记录少,修改频率低,使用频率高,就可以设置IsSaveToMemory="true",这样,这个表的数据将会自动在内存存取,具体将在后面讲解.

attribute是每一个对应的实体属性与表字段名映射,

name为实体的属性名,要与实体类中的属性相同;

column是指表的字段名,这与表中的字段要相同;

type是指类型,如整数型Integer,字符型String,日期型Date,数字型Decimal等.

increment是指字段是否为自动增长,是则标识为true,这样SPL将会从数据库中自动生成;

key值为primary说明此字段是主键,在SPL中每个表必须要有一个主键,这作为表的唯一标识;

Class的Type对照表:

SQL Server

Oracle

XML中的type

.NET内置类型

bigint

NUBMER

BigInt

System.Int64

binary

Binary

System.Byte[]

bit

Boolean

System.Boolean

char

CHAR

String

System.String

datetime

DATE

Date

System.DateTime

decimal

NUMBER

Decimal

System.Decimal

float

FLOAT

Double

System.Double

image

Binary

System.Byte[]

int

NUMBER

Integer

System.Int32

money

Decimal

System.Decimal

nchar

NCHAR

String

System.String

ntext

String

System.String

numeric

NUMBER

Decimal

System.Decimal

nvarchar

NVARCHAR2

String

System.String

real

REAL

Single

System.Single

smalldatetime

DATE

Date

System.DateTime

smallint

NUMBER

SmallInt

System.Int16

smallmoney

Decimal

System.Decimal

sql_variant

Object

System.Object

text

String

System.String

timestamp

Binary

System.Byte[]

tinyint

TinyInt

System.Byte

uniqueidentifier

Guid

System.Guid

varbinary

Binary

System.Byte[]

varchar

VARCHAR2

String,Varchar

System.String

实体类定义

通过以上的XML配置我们已经了解到O/R Mapping的定义方式了,很显然,在作了Entity与Table的映射后,我们还需要在系统中定义Entity类,为了让这些实体类能统一管理,我的建议是大家新建一个Project和NameSpace,因为这些实体类的形式非常相同,可以用代码生成器生成。

我举一个例子来说明实体类结构:

namespace BusinessEntity

{

using System;

using System.Collections;

using System.Data;

using PersistenceLayer;

public class StudentEntity : EntityObject

{

//常量定义部分

public const string __ID = "Id";

public const string __NO = "No";

public const string __NAME = "Name";

public const string __BIRTHDAY = "Birthday";

public const string __GRADE = "Grade";

public const string __SCORE = "Score";

//局部变量定义部分

private int m_Id;

private string m_No;

private string m_Name;

private System.DateTime m_Birthday;

private int m_Grade;

private System.Decimal m_Score;

public StudentEntity()

{

}

//属性定义部分

public int Id

{

get

{

return this.mID;

}

set

{

this.m_ID = value;

}

}

public string No

{

get

{

return this.m_No;

}

set

{

this.m_No = value;

}

}

public string Name

{

get

{

return this.m_Name;

}

set

{

this.m_Name = value;

}

}

public System.DateTime Birthday

{

get

{

return this.m_Birthday;

}

set

{

this.m_ Birthday = value;

}

}

public int Grade

{

get

{

return this.m_Grade;

}

set

{

this.m_Grade = value;

}

}

public System.Decimal Score

{

get

{

return this.m_Score;

}

set

{

this.m_Score = value;

}

}

}

}

讲解如下:

1.实体类的NameSpace可以自己定义,只要定义后记得在系统中引用就可以了。

2.Using的内存就采用那四个就可以了

3.实体类继承于EntityObject,具父类为SPL中的一个public abstract类,只要具体的实体类继承后,实体类就拥有了Save(),Retrieve(),Delete()的实体操作功能。

4.实体类的第一部分为常量定义,在其他的PL中,都没有提到常量定义,而这个常量定义是非常有意义的,因为以后的系统应用中,经常会在没有实体化的情况下使用实体属性名,比如定义Condition时,那么采用常量的话,就可以从实体类直接使用"."操作就可以选择了,如StudentEntity.__Name就代表了Name这个属性。

5.实体的第二部分就是局部变量,只要我们定义好正确的类型即可.

6.实体的第三部分为属性,也就是对应的Set与Get给局部变量即可.

通过以上的代码就很简单的实现了实体类的定义,到此为止SPL的配置与实体类的定义都完成了,也就是我们的使用SPL的准备工作完成了。

初始使用

当我们进行了以上的准备工作后,在应用系统中要进行使用,只要一个步骤就可以了,就是初始化一个SPL,我们使用SPL中的一个Setting类就可以完成:

string DatabaseXml="Config/DatabaseMap.xml";

Setting.Instance().DatabaseMapFile=Server.MapPath(DatabaseXml);

就是通过以上的方式,指定下DatabaseMapFile的地址就可以了,这里当然是绝对地址,所以对于Web来说我们要进行一下MapPath了,而对于WinForm系统来说,只要指定为exe执行目录的相对目录就可以了。

初始化只要系统在开始时运行一次就可以了,所以对于Web来说,可以放在Global里,而我习惯于放在Web的BasePage里,对于WinForm只要在第一个Form上执行一次就可以了,在使用到SPL时会自动进行初始化连接的。

安全性

当然大家自然而然会想到连接的安全性,连接的安全性应该是由大家的系统自己来处理,比如简单一点的方式,我们可以把xml后缀改为config后缀,这样其他人不能直接看到config内容。这当然不能太安全,大家也可能通过加密后放在xml中,自己在初始时进行解密连接。

好了,以上的配置其实是相对简单的,当然以上的这些配置,我们可以通过代码生成器来完成,因为这些内存是基本相同的.

听棠

2004年11月

MSN:tintown_liu@hotmail.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有