XML数据库一睹为快

这是我正在开发的XML数据库的一个演示程序片段。该项目目前还不完整,会在合适的时候开源。

有关该数据库的一些介绍,请参考

http://www.cnblogs.com/chenxizhang/archive/2009/08/08/1541888.html

简单地说,这是一个用XML作为数据存取源的数据库设计方案。完全基于.NET和XML技术,并且使用了LINQ的技术。我自己总结该数据库是:XML+ 面向对象。

  • XML是指其存储格式是XML的
  • 面向对象是指每个表格都映射为一个业务实体(该实体可以很复杂),而且针对数据库的操作完全是面向对象的方式,不用SQL语法
    • 复杂的查询全部可以用LINQ语法来解决。因为数据库方法返回的就是对象类型。

 

大家想想看,如果操作数据库可以像下面这样,是不是也是一个不错的选择呢?如果大家对于XML数据库的开发有兴趣和高见,欢迎给我反馈和讨论

 

using System;
using System.Collections.Generic;

using XMLDatabase;
using DataEntities;
using System.Linq;

namespace SampleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            ///插入1000个订单约13秒,体积为615KB
            ///插入第2000个订单约41秒,体积为1229KB,
            ///插入第3000个订单约77秒,体积为1933KB
            ///
            ///TODO: 应该考虑 插入、删除、更新的优化。这三种情况应该不要去加载全部的文档,能不能用XMLWriter的方式做
            ///应该考虑类似LINQ TO SQL中的SubmitChange的方式,一次性提交
            ///改进了这个设计之后,插入1000个订单连1秒钟都不需要,太酷了

            Console.WriteLine("1:创建数据库");

            using (Database db = Database.CreateInstance("Northwind", "E://Temp")) 
                //在E:/Temp目录下面创建一个叫做Northwind的XML数据库
            {
                Console.WriteLine("/t成功创建了数据库");

                #region 创建几个表
                Console.WriteLine("2:创建表");
                Table
 
   OrderTable = db.Create
  
   (
   "Orders", 
   new[] { 
   "OrderID" });
                Table
   
     CustomerTable = db.Create
    
     (
     "Customers", 
     new[] { 
     "CustomerID" });
                Table
     
       EmployeeTable = db.Create
      
       (
       "Employees", 
       new[] { 
       "EmployeeID" }); Console.WriteLine(
       "/t成功创建了三个表"); 
       #endregion 
       #region 插入记录 Console.WriteLine(
       "3:插入记录"); 
       //插入一个订单记录 OrderTable.Insert( 
       new Order() { OrderID = 10248, CustomerID = 
       "ABCDEF", OrderDate = DateTime.Now, EmployeeID = 1, OrderItems = 
       new List
       
        (){ 
        new OrderItem(){ OrderId=10248, Quantity=20, UnitPrice=25, Product=
        new Product(){ ProductId=1, ProductName=
        "Apple"} }} }); OrderTable.Insert( 
        new Order() { OrderID = 10249, CustomerID = 
        "ABCDEF", OrderDate = DateTime.Now, EmployeeID = 1, OrderItems = 
        new List
        
         (){ 
         new OrderItem(){ OrderId=10249, Quantity=4, UnitPrice=25, Product=
         new Product(){ ProductId=1, ProductName=
         "Pen"}}, 
         new OrderItem(){ OrderId=10249, Quantity=2000, UnitPrice=2, Product=
         new Product(){ ProductId=1, ProductName=
         "Car"} }} }); Console.WriteLine(
         "/t成功插入了两笔订单记录"); 
         //插入一个客户记录 CustomerTable.Insert( 
         new Customer() { CustomerID = 
         "ABCDEF", CompanyName = 
         "Xizhang.com" }); Console.WriteLine(
         "/t成功插入了一笔客户记录"); EmployeeTable.Insert(
         new Employee() { EmployeeID = 1, Name = 
         "陈希章", City = City.上海 }); Console.WriteLine(
         "/t成功插入了一笔员工记录"); db.SubmitChanges();
         //只有提交了才会真正在数据库中生效 Console.WriteLine(
         "/t提交了数据库更改"); 
         #endregion 
         #region 读取记录 
         //这里的查询就是标准的LINQ语法 
         //选择订单金额大于1000的订单 Console.WriteLine(
         "4:数据查询"); var query = from o 
         in OrderTable.Select() 
         where o.OrderItems.Sum(d => d.Quantity * d.UnitPrice) > 1000 select o; 
         foreach (var item 
         in query) { Console.WriteLine(item); } 
         #endregion 
         #region 更新记录 Console.WriteLine(
         "5:更新数据"); var customer = CustomerTable.Select().Where(c => c.CustomerID == 
         "ABCDEF").SingleOrDefault(); Console.WriteLine(
         "/t修改之前"); Console.WriteLine(customer); 
         //进行修改 customer.CompanyName = 
         "Microsoft.com"; CustomerTable.Update(customer); db.SubmitChanges(); Console.WriteLine(
         "/t修改之后"); customer = CustomerTable.Select().Where(c => c.CustomerID == 
         "ABCDEF").SingleOrDefault(); Console.WriteLine(customer); 
         #endregion 
         #region 删除记录 Console.WriteLine(
         "6:删除记录"); var order = OrderTable.Select().Where(o => o.OrderID == 10248).SingleOrDefault(); Console.WriteLine(
         "/t删除之前"); Console.WriteLine(
         "/t" + order); OrderTable.Delete(order); db.SubmitChanges(); Console.WriteLine(
         "/t删除之后"); order = OrderTable.Select().Where(o => o.OrderID == 10248).SingleOrDefault(); 
         if (order == 
         null) Console.WriteLine(
         "/t/t该订单已经不存在"); 
         #endregion 
         #region 清空记录 Console.WriteLine(
         "7:清空记录");
         //相当于DELETE * FROM ... Console.WriteLine(
         "/t清空之前"); var employee = EmployeeTable.Select().FirstOrDefault(); Console.WriteLine(
         "/t" + employee); EmployeeTable.Clear(); db.SubmitChanges(); employee = EmployeeTable.Select().FirstOrDefault(); Console.WriteLine(
         "/t清空之后"); 
         if (employee == 
         null) Console.WriteLine(
         "/t/t该员工已经不存在"); 
         #endregion 
         #region 删除表格 Console.WriteLine(
         "8:删除表格"); Console.WriteLine(
         "/t删除之前"); Console.WriteLine(
         "/t/t客户表是否存在:{0}", db.Exists(
         "Customers")); db.Drop(
         "Customers"); Console.WriteLine(
         "/t删除之后"); Console.WriteLine(
         "/t/t客户表是否存在:{0}", db.Exists(
         "Customers")); 
         #endregion } Console.WriteLine(
         "9:删除数据库"); Database.DeleteInstance(
         "Northwind", 
         @"E:/Temp"); Console.Read(); } } } 
        
       
      
     
    
   
  
 
本文由作者: 陈希章 于 2009/8/9 18:18:30 发布在: 博客园,转载请注明出处
本文是使用 博客同步和管理系统自动于2009/8/9 18:18:33 从 博客园 同步过来的。原文地址: http://www.cnblogs.com/chenxizhang/archive/2009/08/09/1542354.html ,发表于2009/8/9 10:19:00.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值