通用的CRUD之LiteDB

yizhihongxing

前言

你要开发一个系统,是不是首要任务是先建库,建表,建字段,既所谓的数据建模(听起来高大上一点,数据建模也确实是个烧脑的活),要费不少功夫。
不知你是否遇到过这样的场景。A产品有3个测试参数,B产品有6个测试参数,而且值和类型都各不相同,用SQL你要怎么建表呢?
有人会说这简单“参数名,参数值两列搞定”,NO!数据类型考虑了吗,数据量考虑了吗?
有人又说"每个参数建一列,A,B两个产品共建9列用来存各自的值。",如果某天C产品又有9个参数呢,又去增加字段?,你又说”item1,item2...N,多增加几十个备用",有考虑过查询吗?有考虑过他人看到这样的表不头大吗?
还有人说“一列JSON列搞定”,数据查询和数据统计一样把人折磨的不要不要的。

NOSQL的出现,让你眼前一亮,上面的问题迎刃而解。建库,建表,甚至建字段都是很愉悦的事情,你传入什么数据,NOSQL就给你自动创建好,相应的数据库和表(准确的说NoSQL的表叫数据集)。
同一个列可以有不同数据库类型,某一列存单纯的一个数字,还是一个对象都可以随心所欲。

今天要介绍的就是嵌入式NOSQL数据库,LiteDB,就是一个NOSQL版的SQLite。
LiteDB是嵌入式,跨平台,纯c#开发的轻量数据库。详情,请移步到https://www.litedb.org了解。
笔者使用LiteDB,掐指一算,已有6个年头,虽然踩过不少坑,经历过数据库损坏的痛苦经历,但依然没有放弃它,还是爱不释手,因为它在某些应用场景确实非常贴近我的需求。目前经历过几次版本迭代,功能也越来越完善。
现在切入正题
让我一步一步带你增删改查。

安装

Install-Package DbCRUD.LiteDB 安装包

数据库连接及初始化

 //数据库连接
 //LiteDbCRUD testdb = new LiteDbCRUD(@"filename=CRUDTestDB.db");//相对路径([程序目录]\DATA)
 IDbCRUD testdb = new LiteDbCRUD(@"filename=CRUDTestDB.db");//相对路径([程序目录]\DATA)
 //LiteDbCRUD testdb = new LiteDbCRUD(@"filename=C:\CRUDTestDB.db");//绝对路径指定数据库保存路径

插入数据

//**同步插入对象数据
 var customer = new CustomerViwe
 {
     //Id = id + 50, ////实体类,ID不赋值,默认根据数据类型自动整数编号,支持int,long,objectid
     Name = "周彰文",
     Phones = new string[] { "80000", "90000" },
     IsActive = true,
 };
 var result = testdb.Insert(tb_custormer, customer);
 //**同步插入字典数据
   var dic1 = new Dictionary<string, object>
   {
       //{ "_id", 1 },//***如果不指定ID,插入时会自动编一个objectid的唯一ID
       { "Name", "LitedbCRUD" },
       { "Qty", 19},
       { "DDate", DateTime.Now }
   };
   var result11 = testdb.Insert(autoIDData, dic1);

   //插入JSON数据
   string jsondata = JsonConvert.SerializeObject(dic1);
   var result12 =testdb.Insert(tb_jsondata, jsondata);
   //**sql命令插入
   var result13 = testdb.Insert($"insert {sqldata}('name','date') value ('test','2023-05-07')");
   //**批量插入列表
   List<Dictionary<string, object>> listdata = new List<Dictionary<string, object>>();
   int maxid = testdb.Max<int>(dictable);
   for (int i = 0; i < 10; i++)
   {
       maxid++;
       var dic2 = new Dictionary<string, object>
       {
           { "_id",maxid },
           { "Name", "n2" },
           { "Qty", 19+maxid},
           { "DDate", DateTime.Now }
       };
       listdata.Add(dic2);
   }
   var listResult= testdb.Insert(dictable, listdata);

更新数据

    var updata = new Dictionary<string, object>
    {
        { "Name", "更新指定字段数据" },
        { "Qty", 300}
    };
    var upresult = testdb.UpDate(dictable, updata, "_id=2");   //更新_id=2的数据

更新及插入数据(数据存在更新,不存在插入)

   //** 更新或插入数据
   var dic1 = new Dictionary<string, object>
   {
       { "_id", 2 },
       { "Name", "插入或更新单条数据" },
       { "Qty", 200},
       { "DDate", DateTime.Now }
   };
   var result= testdb.Upsert(dictable, dic1);
   Assert.IsTrue(result.Stutas);
   //** 批量插入或更新
   var dic3 = new Dictionary<string, object>
   {
       { "_id", 3 },
       { "Name", "批量插入或更新" },
       { "Qty", 300},
       { "DDATE", DateTime.Now }
   };
   List<Dictionary<string,object>> listdata=new List<Dictionary<string, object>> { dic3,dic1};
   var listresult = testdb.Upsert(dictable, listdata);

查询数据

   //查找id=2的数据
   var databyid = testdb.FindByID<Dictionary<string, object>>(dictable,2);
   //查找Qty>10的数据
   var wheredata = testdb.Find<Dictionary<string, object>>(dictable, "Qty>10");
   //sql语句查找的数据
   string sqlcmd = $"select * from {dictable}";
   var sqldata = testdb.Find<Dictionary<string, object>>(sqlcmd);
   //分页查找的数据
   var pagedata = testdb.GetPagingData<Dictionary<string, object>>(dictable, "Qty>10",pageindex:1,pagenumber:10);

删除数据

   //**删除_id=2的数据
   var result = testdb.Delete(dictable,2);
   //**删除qty<30的数据
   var wherresult = testdb.Delete(dictable, "Qty<30");
   //**使用sql语句删除_id=30的数据
   string sql = $"delete {dictable} where _id=30";
   var sqlresult = testdb.Delete(sql);

更多使用方法请移步到仓库 https://gitee.com/lzcode/db-crud


我的分享希望能给你带去帮助,您的打赏是我继续为您分享的动力。

通用的CRUD之LiteDB

原文链接:https://www.cnblogs.com/zzwen/p/17351036.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:通用的CRUD之LiteDB - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月11日

相关文章

  • C# 中 System.Index 结构体和 Hat 运算符(^)的使用示例

    C# 中 System.Index 结构体和 Hat 运算符(^) 的使用是一项比较新的功能,适用于 C# 8.0 及以上版本,主要用于对序列和数组的索引操作,下面就来详细讲解一下它的使用。 System.Index 结构体 System.Index 结构体是 C# 8.0 添加的一个新类型,它允许我们以更简洁而直观的方式进行索引操作。例如,我们可以使用它来…

    C# 2023年6月7日
    00
  • C#中ref和out的区别浅析

    C#中ref和out的区别浅析 简介 在C#中,关键字ref和out用于传递参数。尽管两个关键字都可以使用相同的参数来传递值,但它们在应用和使用上还是有一些区别,下面进行一一讲解。 ref关键字 ref关键字用于将参数传递给函数并且函数可以修改传递的参数,同时最初传递的参数也会被修改。这里要注意的是,在使用ref关键字时,必须要在通过ref来初始化变量(即在…

    C# 2023年5月15日
    00
  • C# CancellationToken和CancellationTokenSource的用法详解

    C# CancellationToken 和 CancellationTokenSource 用法详解 CancellationToken 和 CancellationTokenSource 是 C# 中用于取消异步操作的机制。本篇攻略将详细讲解这两个类的用法。 CancellationTokenSource CancellationTokenSource …

    C# 2023年5月15日
    00
  • c#实现数据库事务示例分享

    下面是关于“C#实现数据库事务示例分享”的详细攻略。 什么是数据库事务 事务是指作为单个逻辑工作单元执行的一连串操作。 在关系型数据库中,一个事务必须具有四个特性,即:原子性、一致性、隔离性和持久性。 原子性:事务作为一个整体来执行,事务中的操作要么全部完成,要么全部不完成。 一致性:在事务开始和结束时,都必须使数据的完整性保持一致。 隔离性:事务执行过程中…

    C# 2023年6月1日
    00
  • C#中的delegate委托类型基本学习教程

    下面我将为你讲解C#中的delegate委托类型基本学习教程的完整攻略。 什么是delegate(委托)类型? delegate(委托)是C#的一个重要部分,在GUI开发和事件处理等应用中起着至关重要的作用。delegate(委托)类型可以看作是一个函数指针,使程序员能够在运行时动态地关联一个或多个方法到一个委托实例上,并将委托实例作为参数来传递和调用一个方…

    C# 2023年5月15日
    00
  • C# Stream.Flush – 刷新流

    Stream.Flush 方法的作用是将流中的所有缓冲数据都写入其目标(通常是磁盘、网络或其他设备),并清空缓冲区。在调用 Flush 方法后,流可能会保留部分或所有已读取或写入数据的缓存区域,以便再次读取或写入最后部分数据时能够快速访问。 Flush 方法的使用方法如下: // 实例化一个文件流读取器 using (FileStream fileStrea…

    C# 2023年4月19日
    00
  • .Net Core日志记录的核心机制

    .NET Core日志记录的核心机制 在.NET Core中,日志记录是一个非常重要的功能,可以帮助我们在应用程序中记录和跟踪事件。本攻略将介绍.NET Core日志记录的核心机制,并提供两个示例说明。 日志记录的核心机制 在.NET Core中,日志记录的核心机制包括以下几个部分: 1. ILogger ILogger是在.NET Core中记录日志的接口…

    C# 2023年5月17日
    00
  • c#委托与事件(详解)

    C#委托与事件(详解) 什么是委托? 在C#中,委托是一个类,用于指向和调用一个或多个方法。可以将委托看做是方法的类型。通过委托,我们可以在运行时确定要调用哪个方法,而无需提前确定调用哪个方法。 如何定义委托? 在C#中,委托的定义非常简单,只需使用delegate关键字即可。 delegate 返回类型 委托名称(参数列表); 其中, 返回类型:委托指向方…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部