一.SQLite是什么?SQLite是一个用C 语言编写的、轻量级、自包含、无服务器、零配置的SQL 数据库引擎。它将整个数据库存储在一个跨平台的单一文件中支持ACID 事务并且几乎可以在所有操作系统如Windows、Linux、MacOS、Android、iOS上运行。与 MySQL、PostgreSQL 等客户端/服务器型数据库不同SQLite 是嵌入式数据库直接集成到应用程序中无需单独的数据库服务器进程非常适合本地数据存储。主要特点单文件存储整个数据库保存在一个文件中便于备份与迁移。零配置无需安装或管理开箱即用。跨平台文件格式稳定承诺兼容至 2050 年。高可靠性完全支持事务保证数据一致性。小巧高效完整功能下小于 400KiB。典型使用场景嵌入式设备与物联网如智能手表、机顶盒、相机等。低流量网站日访问量 10 万次。数据分析与脚本处理支持 CSV/Excel 导入导出。缓存系统减少主数据库压力。内存/临时数据库快速测试与演示二.使用教程1.创建一个c#项目然后安装必要的包# 3. 安装必要的包 dotnet add package Microsoft.Data.Sqlite dotnet add package Dapper2.创建最简单的模型创建一个文件Person.cspublic class Person { public int Id { get; set; } public string Name { get; set; } public string Power { get; set; } public string Email { get; set; } }3.:封装一个操作数据库的静态类Linq_tableusing 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 nameconnectionString/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 nameconnectionString/param /// param namename/param /// param nameage/param /// param nameemail/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.ExecuteScalarint(sql, new { Name name, Power power, Email email }); return newId; } } /// summary /// 查询所有数据,自动映射为模型类 /// /summary /// returns/returns public static ListPerson GetAllPeople() { using (var connection new SqliteConnection(connectionString)) { connection.Open(); string sql SELECT * FROM Person; // 使用 Dapper 查询自动映射到 Person 对象 var people connection.QueryPerson(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.QueryFirstOrDefaultPerson(sql, new { Id id }); } } /// summary /// 根据id 修改数据 /// /summary /// param nameid/param /// param namename/param /// param namepower/param /// param nameemail/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 nameid/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 ListPerson people; //用户数据库list对象 [HttpGet(int)] public string Get(int id) { string str Linq_table.Get(id);//查询数据表中id的数据 return str; } //查詢全部新聞 [HttpGet] public IEnumerablePerson Get() { people Linq_table.GetAllPeople(); //查询数据表中全部数据 return people; } //新增一筆新聞 [HttpPost] public IEnumerablePerson Post(Person value) { Linq_table.InsertPerson(value.Name, value.Power, value.Email); //插入数据表中一笔数据 people Linq_table.GetAllPeople(); //查询数据表中全部数据 return people; } //修改一筆新聞 [HttpPut({id})] public IEnumerablePerson 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 IEnumerablePerson Delete(int id) { Linq_table.DeletePerson(id);//删除数据表中id的数据 people Linq_table.GetAllPeople(); //查询数据表中全部数据 return people; } } }2.部署到云服务器iis上的区别.与标准的iis服务器部署不同,复制的文件夹需要是整个web_api项目的文件夹(里面有本地数据库)部署选择的物理路径依然是指向publish文件夹(见前面章节)
006.WEB_API使用本地数据库 SQLite + Dapper 入门教程
一.SQLite是什么?SQLite是一个用C 语言编写的、轻量级、自包含、无服务器、零配置的SQL 数据库引擎。它将整个数据库存储在一个跨平台的单一文件中支持ACID 事务并且几乎可以在所有操作系统如Windows、Linux、MacOS、Android、iOS上运行。与 MySQL、PostgreSQL 等客户端/服务器型数据库不同SQLite 是嵌入式数据库直接集成到应用程序中无需单独的数据库服务器进程非常适合本地数据存储。主要特点单文件存储整个数据库保存在一个文件中便于备份与迁移。零配置无需安装或管理开箱即用。跨平台文件格式稳定承诺兼容至 2050 年。高可靠性完全支持事务保证数据一致性。小巧高效完整功能下小于 400KiB。典型使用场景嵌入式设备与物联网如智能手表、机顶盒、相机等。低流量网站日访问量 10 万次。数据分析与脚本处理支持 CSV/Excel 导入导出。缓存系统减少主数据库压力。内存/临时数据库快速测试与演示二.使用教程1.创建一个c#项目然后安装必要的包# 3. 安装必要的包 dotnet add package Microsoft.Data.Sqlite dotnet add package Dapper2.创建最简单的模型创建一个文件Person.cspublic class Person { public int Id { get; set; } public string Name { get; set; } public string Power { get; set; } public string Email { get; set; } }3.:封装一个操作数据库的静态类Linq_tableusing 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 nameconnectionString/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 nameconnectionString/param /// param namename/param /// param nameage/param /// param nameemail/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.ExecuteScalarint(sql, new { Name name, Power power, Email email }); return newId; } } /// summary /// 查询所有数据,自动映射为模型类 /// /summary /// returns/returns public static ListPerson GetAllPeople() { using (var connection new SqliteConnection(connectionString)) { connection.Open(); string sql SELECT * FROM Person; // 使用 Dapper 查询自动映射到 Person 对象 var people connection.QueryPerson(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.QueryFirstOrDefaultPerson(sql, new { Id id }); } } /// summary /// 根据id 修改数据 /// /summary /// param nameid/param /// param namename/param /// param namepower/param /// param nameemail/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 nameid/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 ListPerson people; //用户数据库list对象 [HttpGet(int)] public string Get(int id) { string str Linq_table.Get(id);//查询数据表中id的数据 return str; } //查詢全部新聞 [HttpGet] public IEnumerablePerson Get() { people Linq_table.GetAllPeople(); //查询数据表中全部数据 return people; } //新增一筆新聞 [HttpPost] public IEnumerablePerson Post(Person value) { Linq_table.InsertPerson(value.Name, value.Power, value.Email); //插入数据表中一笔数据 people Linq_table.GetAllPeople(); //查询数据表中全部数据 return people; } //修改一筆新聞 [HttpPut({id})] public IEnumerablePerson 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 IEnumerablePerson Delete(int id) { Linq_table.DeletePerson(id);//删除数据表中id的数据 people Linq_table.GetAllPeople(); //查询数据表中全部数据 return people; } } }2.部署到云服务器iis上的区别.与标准的iis服务器部署不同,复制的文件夹需要是整个web_api项目的文件夹(里面有本地数据库)部署选择的物理路径依然是指向publish文件夹(见前面章节)