zoukankan      html  css  js  c++  java
  • 知识管理系统Data Solution研发日记之十五 数据存储技术 LLBL Gen ORM + Db4o

    这个系列的文章已经进行到第十五讲,今天要讲解的技术是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程序。

  • 相关阅读:
    rac node1节点侦听地址为127.0.0.1问题
    rac crs节点故障(未解决)
    杂牌设备网络接入引起交换机引起端口翻转的故障
    Impdp导出前准备工作以及主要命令
    查询dba_tables视图tablespaces_name为空的问题
    Expdp导出前准备工作以及主要命令
    带参数的方法解析
    类的无参方法,注释
    类和对象的解析
    二重循环的解析
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/2261160.html
Copyright © 2011-2022 走看看