这个系列的文章已经进行到第十五讲,今天要讲解的技术是Data Solution使用的数据存储技术。
因为习惯了ORM开发的缘故,与数据库相关的内容,第一反应就是使用ORM,极大的简化了数据读写的代码编写量。
Data Solution的数据存储也是使用LLBL Gen的ORM框架,源代码的视图是这样的
当你看到DatabaseGeneric和DatabaseSpecific文件夹的时候,这个项目可能就是使用LLBL Gen ORM框架编写的。
来看一下它在ORM设计器中的样子,基本的数据表只有四个,分别存储文档,文档分类,笔记,设定。
这里以自动增长的种子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的图
把参数表名传到写好的Code Smith模板中,可以快速生成对应的实体读写代码。平时对模板的积累很重要,到用的时候,你可以很轻易的完成工作。
然而,代码生成也不能完成所有的工作量,有些代码还是需要人来写,举例如下
- 清除所有文档的代码,如果用代码生成器来写,它会这样写
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程序。