風之力

导航

Perst嵌入式数据库应用小结

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;}
  }
}
然后再给此类定义一个索引类,继承于Persistent
public class ClassRoot : Persistent
 {
  
internal Index IdInex;
  
internal FieldIndex NameIndex;
 }


再要调用数据库的地方打开数据库,方法如下 :
Perst.Storage storage = Perst.StorageFactory.Instance.CreateStorage();
   storage.Open(
"保存数据文件路径",32 * 1024 * 1024);
   Perst.ClassRoot root
=(Perst.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;


}

插入數據方法如下:

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(); //关闭数据连接

}

 

下面是删除操作:

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(); //关闭数据连接

}

 

下面就是查询操作了。对于查询出来的对象可以用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"))//参数:查询表的类型,查询的谓词
{
   Response.Write(c.ID 
+ "__" + c.Name);
class = c;
}
storage.Commit(); 
//执行操作,假如操作失败则恢复到操作之前的状态
storage.Close(); //关闭数据连接

return class;

}

上面是Perst數據庫的一種方法,它是一個文件一個數據表的

下面再介紹一種方法,Database类,它是直接对数据库进行操作,而且一个数据文件里可以存放多张表

1.首先一样先打开数据库 

using Perst;

public Database OpenDatabase()
  {
   Storage storage
=StorageFactory.Instance.CreateStorage();
   s.Open(
"数据文件路径");
   Database db
= new Database(storage); //创建操作数据库的对象

    db.CreateTable(
typeof(Class)); //创建class类型的表,成功返回TRUE,如果存在返回FALSE;
    db.CreateIndex(typeof(Class),"ID",true); //创建索引参数:类型,对应字段,是否唯一
      return db;
  }

 

Database类插入数据:

public void Insert()

{

Database db 
= OpenDatabase();

Class c 
= new Class();

c.ID 
= 1;

c.Name 
= "1";

db.AddRecord(
typeof(Class),c); //插入操作 参数:插入表的类型,插入对象

db.Storage.Commit();
db.Storage.Close();

}

Database类删除数据:

public void Delete()

{

Database db 
= OpenDatabase();

Class c
= new Class(); //已知的对象

c.ID 
= 1;

c.Name 
= "1";

db.DeleteRecord(
typeof(Class),c); //删除操作 参数:删除表的类型,删除对象

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();

}

  小結:

有一个Query类,这是跟查询有关的,应该还有一些让查询更丰富的方法。除了这些基本的,Perst还提供了事务,使用非常简单,只要把操作写在事务start和事务end之间就可以了。
     小项目可以考虑使用perst,至少不用考虑数据库的部署和安全了。
下面是PERST自带的SAMPLE,一看就知道用法了

    

public class Supplier : Persistent 
    {
        
public string name;
        
public string location;
        
public Link   shipments;
    }

    
public class Detail : Persistent 
    {
        
public string id;
        
public float  weight;
        
public Link   shipments;
    }

    
public class Shipment : Persistent 
    { 
        
public Supplier supplier;
        
public Detail   detail;
        
public int      quantity;
        
public long     price;
    }


    
static void skip(string prompt) 
    {
        Console.Write(prompt);
        Console.ReadLine();
    }

    
static String input(string prompt)
    {
        
while (true)
        {
            Console.Write(prompt);
            String line 
= Console.ReadLine().Trim();
            
if (line.Length != 0
            { 
                
return line;
            }
        }
    }

    
static long inputLong(string prompt) 
    { 
        
while (true
        { 
            
try 
            { 
                
return Int32.Parse(input(prompt));
            } 
            
catch (FormatException) 
            { 
                Console.WriteLine(
"Invalid integer constant");
            }
        }
    }

    
static double inputDouble(string prompt) 
    { 
        
while (true
        { 
            
try 
            { 
                
return Double.Parse(input(prompt));
            } 
            
catch (FormatException) 
            { 
                Console.WriteLine(
"Invalid floating point constant");
            }
        }
    }

    
static public void Main(String[] args) 
    { 
        Storage storage 
= StorageFactory.Instance.CreateStorage();
        storage.Open(
"testssd2.dbs");
        Database db 
= new Database(storage);

        db.CreateTable(
typeof(Supplier));
        db.CreateIndex(
typeof(Supplier), "name"true);
        db.CreateTable(
typeof(Detail));
        db.CreateIndex(
typeof(Detail), "id"true);
        db.CreateTable(
typeof(Shipment));

        Query supplierQuery 
= db.Prepare(typeof(Supplier), "name like ?");
        Query detailQuery 
= db.Prepare(typeof(Detail), "id like ?");


        
while (true
        { 
            
try 
            { 
                
switch ((int)inputLong("-------------------------------------\n" + 
                    
"Menu:\n" + 
                    
"1. Add supplier\n" + 
                    
"2. Add detail\n" + 
                    
"3. Add shipment\n" + 
                    
"4. List of suppliers\n" + 
                    
"5. List of details\n" + 
                    
"6. Suppliers of detail\n" + 
                    
"7. Details shipped by supplier\n" + 
                    
"8. Exit\n\n>>"))
                {
                    
case 1:  //普通數據插入
                    {
                        Supplier supplier 
= new Supplier();
                        supplier.name 
= input("Supplier name: ");
                        supplier.location 
= input("Supplier location: ");
                        supplier.shipments 
= storage.CreateLink();
                        db.AddRecord(supplier);
                        storage.Commit();
                        
continue;
                    }
                    
case 2:  //普通的數據插入
                    {
                        Detail detail 
= new Detail();
                        detail.id 
= input("Detail id: ");
                        detail.weight 
= (float)inputDouble("Detail weight: ");
                        detail.shipments 
= storage.CreateLink();
                        db.AddRecord(detail);
                        storage.Commit();
                        
continue;
                    }
                    
case 3:    //以下演示了表之间的关联
                    {
                        Shipment shipment 
= null;
                        
foreach (Supplier supplier in db.Select(typeof(Supplier), "name='" + input("Supplier name: "+ "'"))
                        {
                            
foreach (Detail detail in db.Select(typeof(Detail), "id='" + input("Detail ID: "+ "'"))
                            {
                                shipment 
= new Shipment();
                                shipment.quantity 
= (int)inputLong("Shipment quantity: ");
                                shipment.price 
= inputLong("Shipment price: ");
                                shipment.detail 
= detail;
                                shipment.supplier 
= supplier;
                                detail.shipments.Add(shipment);
                                supplier.shipments.Add(shipment);
                                db.AddRecord(shipment);
                                storage.Commit();
                            }
                        }
                        
if (shipment == null
                        { 
                            Console.WriteLine(
"Supplier+Detail not found");
                        }
                        
continue;
                    }
                    
case 4://普通的查询 
                        foreach (Supplier supplier in db.GetRecords(typeof(Supplier))) 
                        { 
                            Console.WriteLine(
"Supplier name: " + supplier.name + ", supplier.location: " + supplier.location);
                        }
                        
break;
                    
case 5:
                        
foreach (Detail detail in db.GetRecords(typeof(Detail))) 
                        {
                            Console.WriteLine(
"Detail ID: " + detail.id + ", detail.weight: " + detail.weight);
                        }
                        
break;
                    
case 6://使用QUERY类查询 
                    {
                        Hashtable result 
= new Hashtable();
                        detailQuery[
1= input("Detail ID: ");
                        
foreach (Detail detail in detailQuery.Execute(db.GetRecords(typeof(Detail)))) 
                        {
                            
foreach (Shipment shipment in detail.shipments)
                            {
                                result[shipment.supplier] 
= shipment;
                            }
                        }
                        
foreach (Supplier supplier in result.Keys) 
                        {
                            Console.WriteLine(
"Suppplier name: " + supplier.name);
                        }
                        
break;
                    }
                    
case 7:
                    {
                        Hashtable result 
= new Hashtable();
                        supplierQuery[
1= input("Supplier name: ");
                        
foreach (Supplier supplier in supplierQuery.Execute(db.GetRecords(typeof(Supplier)))) 
                        {
                            
foreach (Shipment shipment in supplier.shipments)
                            {
                                result[shipment.detail] 
= shipment;
                            }
                        }
                        
foreach (Detail detail in result.Keys) 
                        {
                            Console.WriteLine(
"Detail ID: " + detail.id);
                        }
                        
break;
                    }
                    
case 8:
                        storage.Close();
                        
return;
                }
                skip(
"Press ENTER to continue");
            } 
            
catch (StorageError x) 
            { 
                Console.WriteLine(
"Error: " + x.Message);
                skip(
"Press ENTER to continue");
            }
        }
    }



 

posted on 2007-09-07 08:52  ZY.Zhou  阅读(1750)  评论(0编辑  收藏  举报