当前位置: 首页 > news >正文

006.WEB_API使用本地数据库 SQLite + Dapper 入门教程

一.SQLite是什么?

SQLite是一个用C 语言编写的、轻量级自包含无服务器零配置SQL 数据库引擎。它将整个数据库存储在一个跨平台的单一文件中,支持ACID 事务,并且几乎可以在所有操作系统(如Windows、Linux、MacOS、Android、iOS)上运行。

与 MySQL、PostgreSQL 等客户端/服务器型数据库不同,SQLite 是嵌入式数据库,直接集成到应用程序中,无需单独的数据库服务器进程,非常适合本地数据存储。

主要特点:

  • 单文件存储:整个数据库保存在一个文件中,便于备份与迁移。

  • 零配置:无需安装或管理,开箱即用。

  • 跨平台:文件格式稳定,承诺兼容至 2050 年。

  • 高可靠性:完全支持事务,保证数据一致性。

  • 小巧高效:完整功能下小于 400KiB。

典型使用场景:

  1. 嵌入式设备与物联网(如智能手表、机顶盒、相机等)。

  2. 低流量网站(日访问量 < 10 万次)。

  3. 数据分析与脚本处理(支持 CSV/Excel 导入导出)。

  4. 缓存系统(减少主数据库压力)。

  5. 内存/临时数据库(快速测试与演示)

二.使用教程

1.创建一个c#项目,然后安装必要的包:

# 3. 安装必要的包 dotnet add package Microsoft.Data.Sqlite dotnet add package Dapper

2.:创建最简单的模型

创建一个文件Person.cs

public class Person { public int Id { get; set; } public string Name { get; set; } public string Power { get; set; } public string Email { get; set; } }

3.:封装一个操作数据库的静态类Linq_table

using Esp32_Server.Models; using System; using System.Collections.Generic; using System.Data; using System.IO; using Dapper; using Microsoft.Data.Sqlite; using System.Numerics; namespace Esp32_Server.Controllers { /// <summary> /// 数据库控制类 /// </summary> public static class Linq_table { static string dbPath = "Login.db";// 1. 数据库文件路径 static string connectionString = $"Data Source={dbPath}"; // 2. 连接字符串 /// <summary> /// 初始化数据库,创建表,除了主程序加载外,其余一律不得调用 /// </summary> /// <returns></returns> public static void Rest() { // 3. 创建数据库和表 CreateDatabase(connectionString); } // 根据id查询数据 public static string Get(int id) { // 6. 查询单个 var person1 = GetPersonById(id); if (person1 != null) { // string str= person1.Name; string str= person1.Power; return (string)str; } return "404"; } /// <summary> /// 创建表格,除了主程序加载外,其余一律不得调用 /// </summary> /// <param name="connectionString"></param> static void CreateDatabase(string connectionString) { // 如果数据库文件不存在,会自动创建 using (var connection = new SqliteConnection(connectionString)) { connection.Open(); // 创建 Person 表 string sql = @" CREATE TABLE IF NOT EXISTS Person ( Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT NOT NULL, Power TEXT NOT NULL, Email TEXT )"; connection.Execute(sql); } } /// <summary> /// 增加数据,返回自动增加的id号 /// </summary> /// <param name="connectionString"></param> /// <param name="name"></param> /// <param name="age"></param> /// <param name="email"></param> /// <returns></returns> public static int InsertPerson(string name, string power, string email) { using (var connection = new SqliteConnection(connectionString)) { connection.Open(); // 插入数据并返回自增ID string sql = @" INSERT INTO Person (Name, Power, Email) VALUES (@Name, @Power, @Email); SELECT last_insert_rowid();"; var newId = connection.ExecuteScalar<int>(sql, new { Name = name, Power = power, Email = email }); return newId; } } /// <summary> /// 查询所有数据,自动映射为模型类 /// </summary> /// <returns></returns> public static List<Person> GetAllPeople() { using (var connection = new SqliteConnection(connectionString)) { connection.Open(); string sql = "SELECT * FROM Person"; // 使用 Dapper 查询,自动映射到 Person 对象 var people = connection.Query<Person>(sql).AsList(); return people; } } static Person GetPersonById( int id) { using (var connection = new SqliteConnection(connectionString)) { connection.Open(); string sql = "SELECT * FROM Person WHERE Id = @Id"; return connection.QueryFirstOrDefault<Person>(sql, new { Id = id }); } } /// <summary> /// 根据id 修改数据 /// </summary> /// <param name="id"></param> /// <param name="name"></param> /// <param name="power"></param> /// <param name="email"></param> public static void UpdatePerson(int id, string name, string power, string email) { using (var connection = new SqliteConnection(connectionString)) { connection.Open(); string sql = @" UPDATE Person SET Name = @Name, Power = @Power, Email = @Email WHERE Id = @Id"; int rows = connection.Execute(sql, new { Id = id, Name = name, Power = power, Email = email }); } } /// <summary> /// 删除一条数据 /// </summary> /// <param name="id"></param> public static void DeletePerson( int id) { using (var connection = new SqliteConnection(connectionString)) { connection.Open(); string sql = "DELETE FROM Person WHERE Id = @Id"; int rows = connection.Execute(sql, new { Id = id }); } } } }

4.主程序Program.cs初始化数据库,并创建一个表

Linq_table.Rest()封装了创建一个数据库的方法,他Rest不能被反复调用,否则会出现一个数据库中重叠数据,于是,我们只在主程序Program.cs中调用一次

using Esp32_Server.Controllers; namespace Esp32_Server { public class Program { public static void Main(string[] args) { Linq_table.Rest(); //主程序增加了这一行,创建数据库和表格 var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi builder.Services.AddOpenApi(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.MapOpenApi(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run(); } } }

当主程序运行起来,这个Rest()方法会在本地计算机,项目相对路径生成一个数据库文件,即:使用SQLite数据库生成的数据库文件是不需要服务器后台的,他的一个本地文件,我们后续对数据库文件的所有增删改查操作都会直接影响这个Loging.db数据库文件

三. 云服务器上使用SQLite_数据库

Login.db文件本身就是本地数据库文件,当项目部署在云服务器上时,它就是云服务器本地的数据库,相对与用户来说和云数据库差不多,只不过服务器的性能会大打折扣,要分出很多算力给数据库,当同时在线的用户超过20+,可能会延迟

1.新建一个控制器类esp32.cs用于处理前端与服务器操作数据库

这个类的增删改查都是调用数据库操作类的增删改查方法,对它的操作都会直接修改我们服务器本地的数据库文件Login.db, 需要特别小心谨慎,设置好权限,保护数据安全或设置过滤器防止误操作等

using Esp32_Server.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.Data.Sqlite; using System; namespace Esp32_Server.Controllers { [Route("api/[controller]")] [ApiController] public class ESP32 : ControllerBase { private List<Person> people; //用户数据库list对象 [HttpGet("int")] public string Get(int id) { string str = Linq_table.Get(id);//查询数据表中id的数据 return str; } //查詢全部新聞 [HttpGet] public IEnumerable<Person> Get() { people = Linq_table.GetAllPeople(); //查询数据表中全部数据 return people; } //新增一筆新聞 [HttpPost] public IEnumerable<Person> Post(Person value) { Linq_table.InsertPerson(value.Name, value.Power, value.Email); //插入数据表中一笔数据 people = Linq_table.GetAllPeople(); //查询数据表中全部数据 return people; } //修改一筆新聞 [HttpPut("{id}")] public IEnumerable<Person> Put(int id, Person value) { Linq_table.UpdatePerson(value.Id, value.Name, value.Power, value.Email); people = Linq_table.GetAllPeople(); //查询数据表中全部数据 return people; } //刪除一筆新聞 [HttpDelete("{id}")] public IEnumerable<Person> Delete(int id) { Linq_table.DeletePerson(id);//删除数据表中id的数据 people = Linq_table.GetAllPeople(); //查询数据表中全部数据 return people; } } }

2.部署到云服务器iis上的区别

.与标准的iis服务器部署不同,复制的文件夹需要是整个web_api项目的文件夹(里面有本地数据库)

部署选择的物理路径依然是指向publish文件夹(见前面章节)

http://www.jsqmd.com/news/994245/

相关文章:

  • 从DIP到TQFP:P89V51微控制器封装选型与PCB设计实战指南
  • 运营商增值业务推广:新游科技四大典型合作场景案例梳理 - 信息热点
  • 别再死记硬背了!用Python 3.10手把手模拟TDM(时分复用)数据传输过程
  • 黑神话悟空内置地图插件:告别迷路的终极导航指南
  • WebSocket好用的点
  • 如何5分钟极速配置LXMusic音源:免费畅享全网音乐的终极指南
  • 3分钟上手!打造你的专属Teamspeak 3音效面板
  • 别再硬编码了!用Vuex+uni-app实现企业级动态TabBar权限管理(附完整代码)
  • 别再手动算权重了!用MATLAB+熵权法优化你的TOPSIS评价模型(附完整代码)
  • 2026寄大件哪个物流便宜?寄半折5折起全网比价实测 - 快递物流资讯
  • YOLOv5 7.0 换‘芯’记:手把手教你用ResNet替换Backbone(附配置文件)
  • Balena Etcher终极指南:重新定义系统镜像烧录的智能解决方案
  • EB Garamond 12:为什么这款免费古典字体是学术写作和优雅设计的终极选择?
  • UniHacker:3分钟解锁Unity全版本,开启免费学习之旅
  • 信息学奥赛解题实战:OpenJudge NOI 1.7 27 单词翻转的三种编程思路详解
  • 5大突破性架构创新:SGLang如何重塑大语言模型服务性能基准
  • 深入解析NXP P60D128安全微控制器:架构、安全与双接口设计
  • 紧凸集嵌入正则性:从泛函分析到非交换理论
  • Navigating the Publication Pipeline: A Practical Guide to SCI Paper Statuses
  • Claude Code 国内配置指南:通过中转 API 实现免代理直连
  • 库萨科技户外无人清扫车:实景案例验证户外场景清扫车解决方案标杆
  • SCI论文辅导机构哪个好?五大论文辅导机构评测! - GrowthUME
  • 3步告别Windows音频切换繁琐:AudioSwitch专业级音频管理解决方案
  • 086、Gold-YOLO 黄金特征聚合:Low-FAM 和 High-FAM 双路径信息融合的实现
  • 基于WCT1000的5W Qi无线充电发射器硬件设计全解析
  • Git安装教程超详细版
  • 从一次内部红队演练看CVE-2018-2894:Weblogic任意文件上传的实战利用与溯源
  • 3步打造专属Office界面:Office Custom UI Editor零代码定制指南 [特殊字符]
  • PCA6416A I2C I/O扩展器:解决MCU引脚不足与混合电压系统设计难题
  • POE接口EMC实战:从电路防护到PCB布局的完整设计指南