嵌入式数据库Perst.Net开发初谈

来源:互联网 发布:设计师的自我修养知乎 编辑:程序博客网 时间:2024/05/24 03:21
使用perst数据库一段时间了,开始使用时没搜索到任何的相关的中文资料。就连英文的也少的可怜。同样是嵌入式数据库Db4o就可以查到一些,但也是寥寥无几,基本都是相同的内容。使用perst后,发现perst存储数据的方式很符合现在的编程方式。开发环境:C#语言VS.NET2003 Perst.Net 。可在http://www.mcobject.com/perst/下载.net环境的开源项目,其中包括了例子和文档,自己的项目中引用Perst.net.dll即可。
 
      常用的类Storage、Index、DataBase。
      对数据的操作可以通过两个类Index和Database。从字义了解,Index也就是通过索引操作,Database则是直接操作数据库。首先看看index类的方法。
首先定义一个实体类,这个类要继承Perst中Persistent类:
public Class : Persistent
{
  int _id;
  public int ID
  {
   get {return _id;}
   set {_id = value;}
  }
  string _name;
  public string Name
  { 
   get {return _id;}
   set {_id = value;}
  }
}
再给这个Class定义一个索引类,同样继承Persistent:
public class ClassRoot : Persistent
 {
  internal Index IdInex;
  internal FieldIndex NameIndex;
 }
     Storage类的作用就像一个接口,通过它可以进行对数据库的连接和访问,可使用Storage类的Open方法打开数据库文件,也可以用它的Root属性给实体类指定对应的索引类。这种方法创建的数据文件,需每个表对应一个数据文件,多个表就要有多个对应的数据文件存在。
还有一点,项目名为A创建的数据文件不能被其他项目名的程序使用。也就是说创建出来的数据文件只对应相项目空间名的程序使用。下面是如何创建和打开一个数据库。
using Perst;   //引用Perst
public Storage OpenDataBase()
{
Storage storage = StorageFactory.Instance.CreateStorage();
   storage.Open("保存数据文件路径",32 * 1024 * 1024);
   ClassRoot root=(ClassRoot)storage.Root;
   if (root==null)
   {
    root=new ClassRoot();
    root.IdInex=storage.CreateIndex(typeof(int),true); //创建一个索引
    root.XmIndex=storage.CreateFieldIndex(typeof(Class),"Name",false); //创建一个文件索引
    storage.Root=root;
   }
   return storage;
}
     这个过程返回一个Storage,Open方法打开数据库,假如数据文件不存在则在相应的路径创建一个并定义其索引。其中第一个参数是文件路径,例:c:/db.dbs,文件后缀什么都可以。第二个参数是定义数据文件的页的大小,可以不填写,则选择默认大小,数据库页越大效率就越高,同时占用空间就越大。CreateIndex是创建一个Index类型的索引,参数:索引类型,是否唯一。虽然是index索引但需要手动赋值。CreateFieldIndex是创建一个文件索引,个人理解应该是唯一索引之类的,参数:所属类型,对应的字段,是否唯一。
     然后看看如何添加数据,这时就需要Index里的方法了。
public void Insert()
{
Storage storage  = OpenDataBase(); //打开数据库
ClassRoot root = (ClassRoot)storage.Root; //指定接口的索引类型
Class class = new Class();
class.ID = 1;
class.Name = "1";
root.IdIndex.Put(class.ID,class);
root.NameIndex.Put(class);
storage.Commit(); //执行操作,假如操作失败则恢复到操作之前的状态
storage.Close(); //关闭数据连接
}
      其中put方法就是插入数据,Index类型的索引参数:索引的值,要插入的对象。FieldIndex类型的索引参数:插入对象。
下面是删除操作:
public void Delete()
{
Storage storage  = OpenDataBase(); //打开数据库
ClassRoot root = (ClassRoot)storage.Root; //指定接口的索引类型
Class class = new Class(); //这时class则是已知的将要删除的对象
class.ID = 1;
class.Name = "1";
root.IdIndex.Remove(class.ID,class);
root.NameIndex.Remove(class);
storage.Commit(); //执行操作,假如操作失败则恢复到操作之前的状态
storage.Close(); //关闭数据连接
}
下面是更新操作的Set()方法,使用set方法时,假如更新的对象存在则执行更新,否则就执行插入操作。
public void Update()
{
Storage storage  = OpenDataBase(); //打开数据库
ClassRoot root = (ClassRoot)storage.Root; //指定接口的索引类型
Class class = new Class(); //这时class则是已知的要更新的对象
class.ID = 1;
class.Name = "1";
root.IdIndex.Set(class.ID,class);
root.NameIndex.Set(class);
storage.Commit(); //执行操作,假如操作失败则恢复到操作之前的状态
storage.Close(); //关闭数据连接
}
我在实际使用中,更新操作似乎是只通过Index索引来判断更新还是插入的,所以更新时一定要知道Index的ID的值。基本操作都有了那下面就是查询操作了。对于查询出来的对象可以用foreach循环来提取。
public Class Select()
{
Storage storage  = OpenDataBase(); //打开数据库
ClassRoot root = (ClassRoot)storage.Root; //指定接口的索引类型
Class class = new Class();
foreach (Class c in root.IdIndex.Select(typeof(Class),"ID = 1"))//参数:查询表的类型,查询的谓词
{
   class = c;
}
storage.Commit(); //执行操作,假如操作失败则恢复到操作之前的状态
storage.Close(); //关闭数据连接
return class;
}
谓词这里我只是知道一些简单的条件查询,例如:= , != ,还是支持order by的升序和降序,order by要小写。
怎么样,perst对数据的操作还是挺简单的吧,起码不需要SQL一样的sa登录了。数据文件也不必担心被偷看,因为perst已经为它做了加密。
中小型项目可以考虑Perst嵌入式数据库。
 
     Database类,这个类也是对数据的操作,只是方式不一样,它是指接对数据库操作,而且一个数据文件里可存放多张表。我对这两个类进行了测试,插入数据的能力还是Database类要好很多,查询性能两个相当。但Database类对我的困扰是没能找到它更新操作的方法。
先看看如何打开数据库:
public Database OpenDatabase()
  {
   Storage storage=StorageFactory.Instance.CreateStorage();
   s.Open("数据文件路径");
   Database db= new Database(storage); //创建操作数据库的对象
   if (db == null) //假如数据库不存在则创建一个
   {
    db.CreateTable(typeof(Class)); //创建class类型的表
    db.CreateIndex(typeof(Class),"ID",true); //创建索引 参数:类型,对应字段,是否唯一
   }
   return db;
  }
 
Database类插入数据:
public void Insert()
{
Database db = OpenDatabase();
Class class = new Class();
c.ID = 1;
c.Name = "1";
db.AddRecord(typeof(Class),class); //插入操作 参数:插入表的类型,插入对象
db.Storage.Commit();
db.Storage.Close();
}
 
Database类删除数据:
public void Delete()
{
Database db = OpenDatabase();
Class class = new Class(); //已知的对象
c.ID = 1;
c.Name = "1";
db.DeleteRecord(typeof(Class),class); //删除操作 参数:删除表的类型,删除对象
db.Storage.Commit();
db.Storage.Close();
}
 
Database类查询数据:
public void Select()
{
Database db = OpenDatabase();
Class class = new Class();
foreach (Class c in db.Select(typeof(Class),"ID =1");
{
   class = c;
}
db.Storage.Commit();
db.Storage.Close();
}
 
     关于Database类的更新操作,还没有在文档中找到相应的方法,我暂时解决的方法是先删除掉原有数据,再插入相应id的新数据。SQL中的更新应该也是这样的,因为做触发器的时候,你会找到Inserted表和Deleted表,不会有Updated表。
     以上是Perst基本操作的方法,它一些深层的东西还有待开发。例如自增索引,还不知道有没有提供这个功能。还有查询的谓词,有一个Query类,这是跟查询有关的,应该还有一些让查询更丰富的方法。除了这些基本的,Perst还提供了事务,使用非常简单,只要把操作写在事务start和事务end之间就可以了。
     小项目可以考虑使用perst,至少不用考虑数据库的部署和安全了。 
原创粉丝点击