现在的位置: 首页 > 综合 > 正文

知识管理系统Data Solution研发日记之十五 数据存储技术 LLBL Gen ORM + Db4o

2012年08月03日 ⁄ 综合 ⁄ 共 4405字 ⁄ 字号 评论关闭

这个系列的文章已经进行到第十五讲,今天要讲解的技术是Data Solution使用的数据存储技术。

因为习惯了ORM开发的缘故,与数据库相关的内容,第一反应就是使用ORM,极大的简化了数据读写的代码编写量。

Data Solution的数据存储也是使用LLBL Gen的ORM框架,源代码的视图是这样的

image

当你看到DatabaseGeneric和DatabaseSpecific文件夹的时候,这个项目可能就是使用LLBL Gen ORM框架编写的。

来看一下它在ORM设计器中的样子,基本的数据表只有四个,分别存储文档,文档分类,笔记,设定。

image

这里以自动增长的种子ID作为数据表主键,简化操作。相对于2.x的LLBL Gen,3.x系列开放了项目文件的格式,它的项目文件llblgenproj是个xml格式的文件,保存了项目的配置设定和实体与表的映射关系,你可以使用Xml技术来对它进行二次开发,或是读写需要的项目数据。在我的ERP开发工具系列中,就有一个小工具,对这个项目文件进行解析。

保存文档的.NET程序,是这样的

public DocumentEntity SaveDocument(DocumentEntity doc)
{
     using (DataAccessAdapter adapter = GetDataAccessAdapter())
     {
          try
          {
                adapter.StartTransaction(IsolationLevel.ReadCommitted, "SaveDocument");
                adapter.SaveEntity(doc, true, false);
                adapter.Commit();
          }
          catch
          {
                 adapter.Rollback();
                 throw;
          }
     }
     return doc;
}
 

删除文档的代码

public void DeleteDocument(int documentId)
{
         DocumentEntity doc = new DocumentEntity(documentId);
         using (DataAccessAdapter adapter = GetDataAccessAdapter())
         {
               adapter.DeleteEntity(doc);
         }

 }

如果你有过LLBL Gen的开发经验,这些代码都是模板代码,是用代码生成器直接生成的。请看下面的Code Smith的图

image

把参数表名传到写好的Code Smith模板中,可以快速生成对应的实体读写代码。平时对模板的积累很重要,到用的时候,你可以很轻易的完成工作。

然而,代码生成也不能完成所有的工作量,有些代码还是需要人来写,举例如下

  1. 清除所有文档的代码,如果用代码生成器来写,它会这样写
public void ClearAllDocument()
 {
       using (DataAccessAdapter adapter = GetDataAccessAdapter())
       {
               ExcludeIncludeFieldsList fields = new ExcludeIncludeFieldsList(false);
               fields.Add(DocumentFields.Recnum);
               EntityCollection<DocumentEntity> docs = GetDocumentCollection(null, null, null, fields);
               foreach (DocumentEntity d in docs)
               {
                    DeleteDocument(d.Recnum);
                }
       }
 }
 

这是先Fetch,再Delete,如果有数据库中有很多文档,这显然是不合理的,即使你看到了,它只读一个字段出来。

应该直接发送SQL语句到数据库服务器中,这样的速度是最快的。

DELETE Document
--OR 
--TRUNCATE TABLE DOCUMENT

2. 批次导入文档(Batch Import)的功能,也不能直接生成,接口和实现代码如下所示

 public static void RTFBatchImport(string[] files)
 {           
       foreach (string file in files)
       {
          Import(file);
       }
 }

public static void Import(string file)
{
       DocumentManager manager = new DocumentManager();
       string subject = Path.GetFileNameWithoutExtension(file);
       manager.SaveDocument(file, subject);
}

接口提供一个字符串数组,表示一组文件名。然后会从磁盘中读取文件到内存中,创建DocumentEntity对象,写入。

 

再来看规则编辑器的规则保存方式,它是用Db4o来保存规则。因为Access的Jet.OLEDB不能运行在x64的环境中,所以没有用Access作规则数据库。也没有把规则存到SQL Server中,虽然这样做起来很容易。规则的基本要求是可以移动,可以共享。开发好了系统,还需要提供一些基本的规则给客户,供他们学习,研究。这样,一个小巧的文件存放规则就是最好的选择了,不需要任何的软件安装。所以,你可以用Db4o的Object Manager来打开规则文件,它就是一个Db40的数据文件。如果你想学习代码,下面的基本例子可以供参考

using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
{
    // do something with db4o
}

//save 
Pilot pilot1 = new Pilot("Michael Schumacher", 100);
db.Store(pilot1);

// retrieve
Pilot proto = new Pilot(null, 0);
IObjectSet result = db.QueryByExample(proto);

// update
IObjectSet result = db.QueryByExample(new Pilot("Michael Schumacher", 0));
Pilot found = (Pilot)result.Next();
found.AddPoints(11);
db.Store(found);

// delete
IObjectSet result = db.QueryByExample(new Pilot("Michael Schumacher", 0));
Pilot found = (Pilot)result.Next();
db.Delete(found);

这是Db4o的基础例子,你可以到官方网站找到更多深入的例子。Data Solution的规则存储方式,就是用的Db4o数据库,以它的托管API来读写规则。

 

请到epn.codeplex.com下载最新版本的Data Loader程序。

抱歉!评论已关闭.