C# 嵌入式数据库LiteDB

之前就有写过LiteDB数据库相关的一篇文章,不过内容比较简单,简单的增删查改,最近项目中又有场景要用到数据库,索性重新写了一篇。

  LiteDBHelper.cs

 LiteDBHelper.cs

public sealed class LiteDBHelper
    {
        private static readonly Lazy lazy = new Lazy(() => new LiteDBHelper());
        public static LiteDBHelper Instance { get { return lazy.Value; } }

        private LiteDBHelper()
        {

        }

        public LiteDB.LiteDatabase db = new LiteDB.LiteDatabase(GetDBPath());

        public ILiteCollection GetA1DataModel()
        {
            return db.GetCollection();
        }
        public ILiteCollection GetA2DataModel()
        {
            return db.GetCollection();
        }
        public ILiteCollection GetB1DataModel()
        {
            return db.GetCollection();
        }
        public ILiteCollection GetB2DataModel()
        {
            return db.GetCollection();
        }

        public static string GetDBPath()
        {
            string connectionString = string.Concat(Globals.Dir_Record_MesData, DateTime.Now.ToString("yyyy-MM-dd"), "\\");
            if (!Directory.Exists(connectionString))
            {
                Directory.CreateDirectory(connectionString);
            }
            connectionString = connectionString + $"/MesData{DateTime.Now.ToString("yyyyMMdd")}.db";
            if (!File.Exists(connectionString))
            {
                File.Create(connectionString).Dispose();  //创建完文件之后,要把资源释放掉,才能继续往文件里书写内容
            }
            return connectionString;
        }

        public class A1DataModel
        {
            public ObjectId Id { get; set; }//唯一标志,序号
            public int CellId { get; set; }//穴位号码
            public string StrNo { get; set; }//串码
            public DateTime datetime { get; set; }//获取到的时间
            public int IsUpload { get; set; }//是否上传了
            public DateTime ModifyTime { get; set; }//最后修改时间
        }

        public class A2DataModel
        {
            public ObjectId Id { get; set; }//唯一标志,序号
            public int CellId { get; set; }//穴位号码
            public string StrNo { get; set; }//串码
            public DateTime datetime { get; set; }//获取到的时间
            public int IsUpload { get; set; }//是否上传了
            public DateTime ModifyTime { get; set; }//最后修改时间
        }

        public class B1DataModel
        {
            public ObjectId Id { get; set; }//唯一标志,序号
            public int CellId { get; set; }//穴位号码
            public string StrNo { get; set; }//串码
            public DateTime datetime { get; set; }//获取到的时间
            public int IsUpload { get; set; }//是否上传了
            public DateTime ModifyTime { get; set; }//最后修改时间
        }

        public class B2DataModel
        {
            public ObjectId Id { get; set; }//唯一标志,序号
            public int CellId { get; set; }//穴位号码
            public string StrNo { get; set; }//串码
            public DateTime datetime { get; set; }//获取到的时间
            public int IsUpload { get; set; }//是否上传了
            public DateTime ModifyTime { get; set; }//最后修改时间

        }
    }

这个位置,我将四个实体模型都写进了这个单例里面,这样方便看一下,同时单例模式也是运用的Lazy   延迟加载对象,来实现对象的线程安全。

接下来我们看如果引用这些操作。

数据的增删查改 

 var db = LiteDataBase.LiteDBHelper.Instance.GetA1DataModel();
            for (int i = 1; i < 11; i++)
            {
                db.Insert(new A1DataModel()
                {
                    CellId = i,
                    datetime = DateTime.Now,
                    IsUpload = i % 2 == 0 ? 0 : 1,
                    StrNo = Guid.NewGuid().ToString().Replace("-", "").ToUpper()
                });
                Thread.Sleep(50);
            }
            var gg = db.Query().Where(x => x.datetime.ToString().Contains("2022")).OrderByDescending(x=>x.datetime).ToList();
            dgv_data.DataSource = gg;
  A1DataModel dt1 = LiteDataBase.LiteDBHelper.Instance.GetA1DataModel().FindOne(x => x.StrNo == strNo);
                    dgv_data.DataSource = dt1;

使用LinqToSQL 

 使用LinqToSQL进行条件查询以及筛选

 List ls = LiteDataBase.LiteDBHelper.Instance.GetA1DataModel().Query().ToList();
            var qulist = (from c in ls
                          orderby
                            c.datetime ascending
                          where c.IsUpload == 0
                          select c.StrNo).Take(1).ToList();
            string val = qulist[0].ToString();
            dgv_data.DataSource = val;

进行查询修改操作 

 A1DataModel am1 = LiteDataBase.LiteDBHelper.Instance.GetA1DataModel().FindOne(x => x.StrNo == strNoinfo);
                    am1.IsUpload = 1;
                    am1.ModifyTime = DateTime.Now;
                    am1.CellId = cellIndex;
                    result = LiteDataBase.LiteDBHelper.Instance.GetA1DataModel().Update(am1);

LiteDB是一个小型、快速、轻量级的.NET NoSQL嵌入式数据库。

  • Serverless NoSQL Document Store
  • 简单的API,类似于MongoDB
  • 单个DLL中.NET 4.5/NETStandard1.3/2.0的100%C代码(小于450kb)
  • Thread-safe
  • 具有完整事务支持的ACID
  • 写入失败后的数据恢复(WAL日志文件)
  • 使用DES(AES)加密的数据文件加密
  • 使用属性或fluent mapper API将您的POCO类映射到BsonDocument
  • 存储文件和流数据(如MongoDB中的GridFS)
  • 单数据文件存储(如SQLite)
  • 索引文档字段以进行快速搜索
  • LINQ对查询的支持
  • SQL-Like访问/转换数据的命令
  • LiteDB Studio-用于数据访问的漂亮UI
  • 开源,人人免费-包括商业用途
  • 从NuGet安装:Install-Package LiteDB

New v5 

  • 新的存储引擎
  • read操作没有锁(多个读卡器)
  • 每个集合Write个锁(多个写入程序)
  • Internal/System collections
  • New SQL-Like Syntax
  • 新的查询引擎(支持投影、排序、筛选、查询)
  • 部分文档加载(根级别)

你可能感兴趣的:(个人总结,C#面向对象,数据库,c#,LiteDB,db)