轻量级数据持久层Seaking.PL简介及建议征集

引言

    Seaking.PL(以下简称PL)是我刚刚完成的一个轻量级数据持久层,在众多的数据持久层产品中,PL或许显得有些稚嫩,甚至有点难登大雅之堂,但是我相信,至于对于一部分应用,PL可能会是一个简易而实用的选择。
    以下是PL的简介及使用说明,希望大家多多指点并提出建议,与大家共享一个迅速成长并不断完善的PL,也是我写此文的目的所在。

一、概述
PL除具有一般数据持久层的共性外,还具有以下特点:
1. 无须配置文件及其他设置,最简单化的应用。
2. 自动生成实体类。利用随同PL一起发布的代码模板可以自动生成实体类。
3. 多数据源支持。目前可支持SqlServer、OleDb、Odbc、Oracle数据源。
4. 支持空值(与DBNull.Value对应)处理。
5. 支持事务处理。
6. 同时支持面向对象的实体类及ADO.NET数据集的操作。
7. 完全参数化的SQL生成。
8. 相对强大的数据查询功能。
    PL需待完善的功能:关系映射。

二、组成
1. 主要对象
从客户程序的角度看,PL主要由DataProvider(数据提供者)、Session(会话)、Query(查询)三个对象组成。
DataProvider是PL的基础,同时也是Session和Query的工厂。
Session是客户程序与数据源的一次会话,会话过程中可以对多个实体(Entity)或数据集进行查询、添加、修改、删除等操作,会话过程对事务提供了完善的支持。
Query是一个查询对象,不具备Session的操作功能,但数据查询功能比Session更加强大,包括对View(视图)的查询及对Join(关联)、Condition(条件)、Order(排序)、Alias(别名)等的支持。
2. 其他对象
其他对象包括Entity(实体)、Property(属性)、Condition(条件)和ConditionColection(条件集合)、Log(日志)等,并使用了微软的DAAB数据访问组件3.0。
Entity与数据表(DataTable)相对应,是最常用的对象,其本身并不是PL的一部分,但必须继承PL.IEntity接口。Entity可以利用随同PL一起发布的代码模板自动生成。
Property与数据列(DataColumn)相对应,用来定义Entity的属性,同数据表应该具有主键字段一样,每个Entity应该有一个主键属性,用来对Entity进行唯一标识。PL共提供了24个Property类,分别与DbType枚举的24个成员相对应。
Condition和ConditionColection为数据查询提供了条件的定义,由Session和Query共用。
Log为PL提供了日志功能,主要用来记录PL使用过程中出现的异常信息或警告信息。
三、使用
1. 引用
在项目中添加对PL的引用。
2. 生成实体类
根据PL提供的代码模板自动生成与数据表相对应的实体类。
实体类示例代码如下:

using System;
using PL;
using PL.Property;

namespace myPL
{
    
public class Employee : IEntity
    
{
        
public Employee()
        
{
            Initialize();
        }

        
        
TableName , FieldName
        
        
Private Member
        
        
Initialize
        
        
Properties
    }

}

由于实体类中包含与数据表的映射关系及其他属性,并对空值处理提供了支持,实体类略显肥大。
3. 初始化DataProvider
在使用PL前,必须对DataProvider进行初始化处理,即指定数据源类型及连接字符串,代码大致如下:
PL.DataProvider dp=new DataProvider(DataProviderKind.SqlServer,"Server=
(local);Database=MyTemp;Integrated Security=True;");

PL.DataProvider dp=new DataProvider();
dp.DataProviderKind
=DataProviderKind.SqlServer;
dp.ConnectionString
="Server=(local);Database=MyTemp;Integrated security=True;";

考虑到一个程序中可能会访问不同的数据源或多个数据库,DataProvider提供的是非静态成员,需对DataProvider进行实例化后使用。同时强烈建议将DataProvider实例化为整个程序都可以访问的静态成员,这样使整个程序中只实例化一个DataProvider对象即可(当然如果需要访问多数据源/库,就需要对应的实例化多个DataProvider)。
4. 使用
A. Session
Session是所有实体或数据集的操作类,是PL中最主要的对象。
Session不能用new进行实例化,而必须由DataProvider生成。

Session se=dp.NewSession();
a. 实体的获取
Employee em =(Employee)se.LoadEntity(typeof(Employee),10); //根据类型获取
Employee em=new Employee();//实例化“空”的实体
se.LoadEntity(em,10);

说明:代码中的10为Employee的主键属性的值,object类型,以下代码中可能会多次出现这种格式,将不再说明。
b. 实体的更新

em.Name.Value="Mike";
se.Update(em);
c. 实体的删除
se.Delete(em);

se.Delete(typeof(Employee),10);
d. 实体的增加
Employee em=new Employee();
em.Name.Value
="Mike";
em.Age.Value
=25;
se.Insert(em);

实体的更新和增加还可以统一写成:

se.Save(em);

如果em在数据源中不存在,将执行Insert操作,否则执行Update操作。
e. 获取实体集合
ArrayList emList=se.LoadEntityList(typeof(Employee));
如果需要,可以在获取实体集合时指定条件。
f. 获取实体主键属性值的集合
ArrayList pkList=se.LoadPkValueList(typeof(Employee));

当数据量较大或每个实体的属性较多时,一次性获取所有实体的集合或许不是最好的选择,主键属性值集合为客户程序采用“大颗粒”模式提供了必要的支持。
g. 实体存在性检测

bool isExist=se.IsExist(em);

bool isExist=se.IsExist(typeof(Employee),10);
h. 获取或填充数据集
DataSet ds=se.LoadDataSet(typeof(Employee));
DataSet ds=new DataSet();
se.FillDataSet(
typeof(Employee), ds);
如果需要,可以在获取或填充数据集时指定条件。
i. 根据数据集更新数据源
se.Update(typeof(Employee),ds);
j. 使用事务
在会话过程中,可以非常方便的使用事务。
开始事务:
se.BeginTransaction();
提交事务:
se.TransactionCommit();
回滚事务:
se.TransactionRollback();

虽然事务只能存在于一次会话中,但不难看出,客户程序可以非常方便的实现多个会话(可能会访问不同的数据源/库)的事务处理。
B. Query
将在近期的续篇中对PL中的另一个主要对象Query及辅助对象Condition、ConditionColection的使用进行说明。

结束
1. 建议征集
由于本人对数据持久层缺乏深入的理解,PL可能存在许多不合理或待完善之处,真诚希望大家能够多多指点,提出建议,让PL不断成长和完善。
2. 关于软件发布
由于PL刚刚完成,可能尚有许多不完善之处,也不可避免的可能存在一些Bug,所以未敢贸然将PL发布出来。我会在听取大家的建议并将PL基本完善后,近期在我的Blog上提供PL的下载并陆续发布PL的文档及Demo,敬请感兴趣的朋友留意。
3. 关于开源
如果大家对PL感兴趣并有意为PL的成长和完善提供指导和帮助,我会考虑在适当的时候逐步对PL开源。
4. 致谢
非常感谢大家阅读此文及对PL的关注,同时希望通过大家的指点及帮助,将一个更加完善的PL与大家共享。


2006.7.7 补充:Seaking.PL--Query对象简介已经发布。

posted @ 2006-07-02 08:27  同一片海  阅读(3031)  评论(13编辑  收藏  举报