• C# 嵌入式数据库LiteDB


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

      LiteDBHelper.cs

     LiteDBHelper.cs

    1. public sealed class LiteDBHelper
    2. {
    3. private static readonly Lazy lazy = new Lazy(() => new LiteDBHelper());
    4. public static LiteDBHelper Instance { get { return lazy.Value; } }
    5. private LiteDBHelper()
    6. {
    7. }
    8. public LiteDB.LiteDatabase db = new LiteDB.LiteDatabase(GetDBPath());
    9. public ILiteCollection<A1DataModel> GetA1DataModel()
    10. {
    11. return db.GetCollection();
    12. }
    13. public ILiteCollection<A2DataModel> GetA2DataModel()
    14. {
    15. return db.GetCollection();
    16. }
    17. public ILiteCollection<B1DataModel> GetB1DataModel()
    18. {
    19. return db.GetCollection();
    20. }
    21. public ILiteCollection<B2DataModel> GetB2DataModel()
    22. {
    23. return db.GetCollection();
    24. }
    25. public static string GetDBPath()
    26. {
    27. string connectionString = string.Concat(Globals.Dir_Record_MesData, DateTime.Now.ToString("yyyy-MM-dd"), "\\");
    28. if (!Directory.Exists(connectionString))
    29. {
    30. Directory.CreateDirectory(connectionString);
    31. }
    32. connectionString = connectionString + $"/MesData{DateTime.Now.ToString("yyyyMMdd")}.db";
    33. if (!File.Exists(connectionString))
    34. {
    35. File.Create(connectionString).Dispose(); //创建完文件之后,要把资源释放掉,才能继续往文件里书写内容
    36. }
    37. return connectionString;
    38. }
    39. public class A1DataModel
    40. {
    41. public ObjectId Id { get; set; }//唯一标志,序号
    42. public int CellId { get; set; }//穴位号码
    43. public string StrNo { get; set; }//串码
    44. public DateTime datetime { get; set; }//获取到的时间
    45. public int IsUpload { get; set; }//是否上传了
    46. public DateTime ModifyTime { get; set; }//最后修改时间
    47. }
    48. public class A2DataModel
    49. {
    50. public ObjectId Id { get; set; }//唯一标志,序号
    51. public int CellId { get; set; }//穴位号码
    52. public string StrNo { get; set; }//串码
    53. public DateTime datetime { get; set; }//获取到的时间
    54. public int IsUpload { get; set; }//是否上传了
    55. public DateTime ModifyTime { get; set; }//最后修改时间
    56. }
    57. public class B1DataModel
    58. {
    59. public ObjectId Id { get; set; }//唯一标志,序号
    60. public int CellId { get; set; }//穴位号码
    61. public string StrNo { get; set; }//串码
    62. public DateTime datetime { get; set; }//获取到的时间
    63. public int IsUpload { get; set; }//是否上传了
    64. public DateTime ModifyTime { get; set; }//最后修改时间
    65. }
    66. public class B2DataModel
    67. {
    68. public ObjectId Id { get; set; }//唯一标志,序号
    69. public int CellId { get; set; }//穴位号码
    70. public string StrNo { get; set; }//串码
    71. public DateTime datetime { get; set; }//获取到的时间
    72. public int IsUpload { get; set; }//是否上传了
    73. public DateTime ModifyTime { get; set; }//最后修改时间
    74. }
    75. }

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

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

    数据的增删查改 

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

    使用LinqToSQL 

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

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

    进行查询修改操作 

    1. A1DataModel am1 = LiteDataBase.LiteDBHelper.Instance.GetA1DataModel().FindOne(x => x.StrNo == strNoinfo);
    2. am1.IsUpload = 1;
    3. am1.ModifyTime = DateTime.Now;
    4. am1.CellId = cellIndex;
    5. 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
    • 新的查询引擎(支持投影、排序、筛选、查询)
    • 部分文档加载(根级别)
  • 相关阅读:
    【编程题】【Scratch四级】2020.12 绘图程序优化
    Redis 大 key 要如何处理?
    网络安全(黑客技术)—2024自学手册
    JAVA技能树-打卡
    面向对象设计原则之依赖倒置原则
    【STL】string类(中)
    java毕业生设计疫情防控医用品管理计算机源码+系统+mysql+调试部署+lw
    spring boot实现短信验证码功能
    【POJ No. 2449】 第K 短路 Remmarguts‘ Date
    LeetCode刷题(python版)——Topic53最大子数组和
  • 原文地址:https://blog.csdn.net/Amazing_Pei/article/details/127728210