ChinaDHF
学而不思则罔,思而不学则殆。
posts - 41,  comments - 214,  trackbacks - 4

引言

    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 on 2006-07-02 08:27 东海风 阅读(2092) 评论(13)  编辑 收藏

FeedBack:
2006-07-02 09:41 | 高海东      
早点开源 大家共同完善不是更好
  回复  引用  查看    
2006-07-02 10:42 | test^_^ [未注册用户]
看起来不错,hibernate 太重量级了, 看看轻量级的怎样
  回复  引用    
2006-07-02 15:25 | ekinwt [未注册用户]
感觉有些设计不是很合理.....
很多地方都用到了反射,性能估计怎么样....
我也做了一个,可能设计上没有楼主这么专业,不过感觉也还是挺好用的..
并且避免了用反射来对实体类进行操作.....

Employee em =(Employee)se.LoadEntity(typeof(Employee),10);
像这种感觉可以用泛型更得更完美些的.....

有空可以发邮件交流一下呀,我也有很多不懂:ekinwt@gmail.com
  回复  引用    
#4楼 [楼主]
2006-07-02 15:45 | 东海风      
@高海东
我对开源管理没有经验,而且我好象隐约感到不规范的开源不一定对软件有利,但是我会在时机成熟时开源的。
@test^_^
谢谢。
@ekinwt
做数据持久层,如果不用反射好象真还没想出什么办法:持久层只能要求实体类遵循一定的规范,但却没法事先预知实体类的成员,这恐怕只能用反射来“查询”。我记得看过一篇关于反射性能的文章(不记得在哪儿了),事实上反射的性能并没有我们印象中的那样糟,对性能要求不是非常严格的程序应该是可以接受的。不知你用怎样的思路避免使用反射的,希望一起交流。
另:目前PL是在.Net1.1下完成的,尚不存在泛型。有空向你学习啊。
  回复  引用  查看    
2006-07-03 00:42 | GoKu [未注册用户]
希望可以支持MYSQL
  回复  引用    
2006-07-03 10:57 | 月の树      
我最近也做了一个数据持久层的东西,不过估计也只能在我们自己公司使用。。。由于boss的意愿,公司的开发是把数据库设计和代码编写分开的,两者的交互只用存储过程,所以我的数据持久层是基于存储过程的,不需要太复杂的查询(数据逻辑都是在存储过程中搞掂)。
另外,就是为了快速开发的方便,提供了Collection与DataTable的转换
主要实现功能:关系映射、事务、延迟加载、数据缓存(不过我觉得有些功能是为技术而实现的,嘿嘿)

@ekinwt
如何可以避免用反射?我也想讨教一下 ^_^

  回复  引用  查看    
2006-07-04 10:51 | 乌鸦 [未注册用户]
双十
  回复  引用    
2006-07-07 10:37 | 达达      
@月の树
@东海风
我的持久层框架就是不用反射的,主要原理是使用代码生成工具为每张表对应生成实体类的数据提供者类,这样避免了单一的数据提供者类使用反射来获取每种实体类中的表影射信息。

我Blog上已经不是最新版,最新版这两天发上来顺便写个详细的说明,大家可以一起讨论讨论

http://bg5sbk.cnblogs.com/archive/2006/04/28/BG5SBK_Framework_Data_V2_ALL.html

最新版目前支持类似以下的操作:

//创建实体对象
table1 _newItem = new Entity.table1();
_newItem.CreateTime = DateTime.Now;

//启动数据库会话
using (DatabaseSession _seesion = new DatabaseSession())
{
DataProvider<Entity.table1>.GetInstance().Insert(_newItem);
}

GridView1.DataBind(); //我用ObjectDataSource绑定,所以不用重新设置DataSource

DataProvider<T>.GetInstance()是新版中唯一用到反射的地方(为了接口统一,以及下一版本使用CodeDom代替代码生成工具),GetInstance()根据实体类型创建对应的数据提供者类实例,久版本中是:
table1_DataProvider.DefaultInstance.Insert(_newItem);

我的持久层现在最主要问题是不能做到搂主这样的隐藏SQL脚本
  回复  引用  查看    
#9楼 [楼主]
2006-07-07 11:08 | 东海风      
首先感谢大家的关注。
@达达
为每个表生成实体类和数据提供者类(如果没理解错的话,应该类似于我所指的操作类)可以说是各有利弊吧,这样的确可以避免反射,提高性能,但感觉起来就是类太多了点,呵呵。
在我使用持久层以前,我是用CodeSmith为每个表生成实体层、数据访问层、通用业务层来做的,使用起来也不错,但项目一大就感觉到管理的困难了,这可能也是代码生成方式的通病吧。
我会抽空仔细看一下你的文章,希望以后多多交流。
  回复  引用  查看    
2006-07-07 12:07 | 达达      
@东海风
http://bg5sbk.cnblogs.com/archive/2006/07/07/BG5SBK_Framework_Data_Update2.html

我的更新

的确是有你说的问题!!正在考虑用CodeDom
  回复  引用  查看    
2006-07-10 08:12 | foolnet      
websharp.orm 2.0中使用了codedom和范型,而且开源。请参考:
www.websharp.org
  回复  引用  查看    
2007-08-06 11:17 | 无极客服 [未注册用户]
下面我给你们介绍个真实的刷MB外挂

无极工作室强力打造了一款劲舞刷MB外挂

外挂名称:劲舞商城助手

外挂版本分为个人版及网吧大众版

随外挂配套刷MB教程,您可以下载观看并学习如何操作!

本工作室主页经过美化,绝对不是一般的草草了事
您可以登陆http://www.9umb.cn查看

我们的留言本有客户对本站服务的反馈情况
如还有疑问还咨询在线QQ:408934730
工作时间:早8点~晚12点 16小时为您提供最完善的服务

1:关于刷MB:
【初级会员200元/月】,每日可刷2万MB
【普通会员400元/季】,每日可刷4万MB
【高级会员800元/年】,每日可刷6万MB
【终身会员1200元/终身】,每日可刷8万MB

2:关于喇叭:
喇叭包月 355元/月
每天为您游戏帐号激活1200个小喇叭(或者300个大喇叭)

3:关于黑点:
最新黑点价格:

100元=3万MB 200元=7万MB 300元=12万MB

黑点多买多送!

4:关于代练:
另外本工作室本着“低价格 高效率”的宗旨代练劲舞等级
每天保证最低经验80万(合作网吧+经验双倍卡)
让您在20天内从舞痴冲刺到舞神
代练时还可随时登陆网站查询当天代练进度!!

您还在考虑什么?无极工作室是您最好的福音!!

  回复  引用    
2007-09-27 03:44 | sadsad [未注册用户]
无极工作室 专用QQ:408934730
网站http://Www.9Umb.Cn 这网站是垃圾的压缩网站。。
里面有来宾留言。。看似真实。。但是和其它网站一样。都是空壳子
没有真实身份验证。。毫无真实性。。里面的来宾留言也是为了骗大家的。而且他提供的所谓骗人的网站也是为了蒙骗大家。。会员200每天能刷2WMB 235每天可换不同的号码刷黑点2WMB。。还可以终身会员 分期付款。。这都是想剥夺大家的信任。。带练级也是假的。。自己在这里受骗了。。希望大家别受骗上当。。没这么好的事。。得小便宜吃大亏!!大家记住 没有天上掉馅饼的好事!!!如果有疑问请加我QQ:593154022

  回复  引用    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-08-19 18:01 编辑过


相关链接:
 
计数器:

阿里妈妈再掀疯狂采购风,网站广告位严重告急,急召天下站长


<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

与我联系

搜索

 

常用链接

留言簿(3)

随笔档案(39)

收藏夹(12)

技术网站

阅读排行榜