DotNet 笔记

东方欲晓,莫道君起早。

.Net面向对象型数据库NDatabase的简单使用

先看一下介绍:

NDatabase是一个易于使用的.NET对象数据库。为了避免关系数据库带来的开销,可以尝试用NDatabase。NDatabase是新一代的面向对象数据库:1个原生的.NET数据库持久层。它的主要特征有:

a、简单:NDatabase非常简单,很容易学习上手使用;它API是简单,不需要学习任何数据库映射技术;不需要对象和存储持久层之间的映射;NDatabase以最简单的方式存储对象;不需要安装和管理。你不必关心如何创建数据库,如何创建表的,你就当做是把数据向“内存/session/缓存等容器”中放的就行了(其实这个还是持久化为数据文件,但咱们不要关心这些)

b、小:NDatabase 运行时小于300Kb,部署程序的时候,很容易集成到.NET应用程序中去。

c、安全健壮:NDatabase支持ACID事务处理,保证数据的完整性。即使在硬件故障的情况下,所有的提交工作都会应用到数据库,在下一次启动的时候自动执行。单一数据库文件:NDatabase使用单一的文件存储所有的数据,包括元数据,对象,索引等。

d、生产率:NDatabase使用很少的代码来进行数据持久化,不需要映射。因此,开发人员可以专注于业务逻辑的实现,而不是在数据持久层浪费时间。

Ok,具体用法看代码,项目需要引用一个dll,点击下载:NDatabase3.dll (292.00 kb)

下面来看一段例子:

using NDatabase;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NDatabaseDo
{
    class Program
    {
        //设置数据库文件
        const string dbFileName = "game.db";
        static void Main(string[] args)
        {
            // 方便测试,先清空一下数据库
            OdbFactory.Delete(dbFileName);
            //添加
            AddTest();
            //查询 支持linq的语法查询和方法查询
            SelectTest();
            //更新
            UpdateTest();
            //删除
            DelTest();


        }
        #region 删除
        static void DelTest()
        {
            using (var odb = OdbFactory.Open(dbFileName))
            {
                var mages = odb.Query<Mage>().Execute<Mage>();
                foreach (var h in mages)
                {
                    //方式1:通过对象id删除
                    var oid = odb.GetObjectId(h);
                    odb.DeleteObjectWithId(oid);

                    //方式2:直接删除
                    //odb.Delete(h);
                }
            }
        }
        #endregion

        #region 修改
        static void UpdateTest()
        {
            using (var odb = OdbFactory.Open(dbFileName))
            {
                //先查出来,然后直接修改值就行了
                var mages = odb.Query<Mage>().Execute<Mage>();
                foreach (var h in mages)
                {

                    h.Name = "zhifeiya_123";
                    //此处可以直接为对象赋值
                    //h.AnyObject=new AnyObject{....}
                }
            }
        }
        #endregion

        #region 添加
        static void AddTest()
        {
            //添加
            using (var odb = OdbFactory.Open(dbFileName))
            {
                for (int i = 0; i <= 100; i++)
                {
                    IHero mage = new Mage("zhifeiya" + Guid.NewGuid().ToString(), 1.1 + i, 2.2 + i);
                    IHero warrior = new Warrior("liminghao", 3.3 + i, 4.4 + i);
                    odb.Store(mage);
                    odb.Store(warrior);
                }
            }
        }

        static void AddTest2()
        {
            IHero mage = new Mage("zhifeiya", 1.1, 2.2);
            IHero warrior = new Warrior("liminghao", 3.3, 4.4);
            //添加
            using (var odb = OdbFactory.Open(dbFileName))
            {
                odb.Store(new { l1 = mage, l2 = warrior });
            }
        }
        #endregion

        #region 查询
        static void SelectTest()
        {
            using (var odb = OdbFactory.Open(dbFileName))
            {
                //查询Mage对象
                var mages2 = odb.Query<Mage>().Execute<Mage>();
                foreach (var h in mages2)
                {
                    Console.WriteLine(h);
                }
                //查询Warrior对象
                var warriors = odb.Query<Warrior>().Execute<Warrior>();
                foreach (var hero in warriors)
                {
                    Console.WriteLine(hero);
                }
                Console.WriteLine("Start working with IHero interface.");

                // 查询IHero接口的所有对象
                var heroes = odb.Query<IHero>().Execute<IHero>();
                foreach (var hero in heroes)
                {
                    Console.WriteLine(hero);
                }

                var query = odb.Query<IHero>();
                //等于
                query.Descend("Name").Constrain("zhifeiya").Equal();
                var rs1 = query.Execute<IHero>();
                //不等于
                query.Descend("Name").Constrain("zhifeiya").Equal().Not();
                var rs2 = query.Execute<IHero>();
                //排序
                query.Descend("Attack").OrderAscending();
                var rs3 = query.Execute<IHero>();
                query.Descend("Attack").OrderDescending();
                var rs4 = query.Execute<IHero>();
                //包含
                query.Descend("Name").Constrain("d").Contains();
                var rs5 = query.Execute<IHero>();
                //不包含
                query.Descend("Name").Constrain("d").Contains().Not();
                var rs6 = query.Execute<IHero>();
                //StartsWith(BOOL b)  参数表示大小写是否敏感  
                query.Descend("Name").Constrain("ZHIFEI").StartsWith(false).EndsWith(false).Not();
                var rs7 = query.Execute<IHero>();
                //Like
                query.Descend("Name").Constrain("%nnis").Like();
                var rs8 = query.Execute<IHero>();
                //Or
                (query.Descend("Name").Constrain("zhifeiyaa").Equal()).Or(query.Descend("Name").Constrain("%abcd").Like());
                var rs9 = query.Execute<IHero>();
                //and
                (query.Descend("Name").Constrain("zhifeiyaa").Equal()).And(query.Descend("Name").Constrain("%defg").Like().Not());
                var rs10 = query.Execute<IHero>();

                //小于
                query.Descend("Attack").Constrain(2).Smaller();
                var rs11 = query.Execute<IHero>();

                //大于
                query.Descend("Attack").Constrain(102).Smaller().Not();
                var rs12 = query.Execute<IHero>();

                //linq,注意:‘左右内等链接’好像不可以
                Mage gotMage = (from r in odb.AsQueryable<Mage>()
                                where r.Defense > 102 && r.Name.Contains("zhifeiya")
                                select r).FirstOrDefault();

            }
        }
        #endregion

    }


    #region 测试代码、基础类 Mage:IHero 和 Warrior:IHero

    /// <summary>
    /// 接口
    /// </summary>
    public interface IHero
    {
        string Name { get; }

        double Attack { get; }
        double Defense { get; }
    }
    public sealed class Mage : IHero
    {
        public Mage(string name, double attack, double defense)
        {
            Name = name;
            Attack = attack;
            Defense = defense;
        }

        #region Implementation of IHero

        public string Name { get; set; }
        public double Attack { get; set; }
        public double Defense { get; set; }

        #endregion

        public override string ToString()
        {
            return string.Format("[Mage] Name: {0}, Attack: {1}, Defense: {2}", Name, Attack, Defense);
        }
    }

    public sealed class Warrior : IHero
    {
        public Warrior(string name, double attack, double defense)
        {
            Name = name;
            Attack = attack;
            Defense = defense;
        }

        #region Implementation of IHero

        public string Name { get; set; }
        public double Attack { get; set; }
        public double Defense { get; set; }

        #endregion

        public override string ToString()
        {
            return string.Format("[Warrior] Name: {0}, Attack: {1}, Defense: {2}", Name, Attack, Defense);
        }
    }
    #endregion
}

 

Loading