一.SQLite是什么?
SQLite 是一个用 C 语言 编写的、轻量级 、自包含 、无服务器、零配置 的 SQL 数据库引擎 。它将整个数据库存储在一个跨平台的单一文件中,支持 ACID 事务 ,并且几乎可以在所有操作系统(如 Windows、Linux、MacOS、Android、iOS)上运行。
与 MySQL、PostgreSQL 等 客户端/服务器型数据库 不同,SQLite 是 嵌入式数据库,直接集成到应用程序中,无需单独的数据库服务器进程,非常适合本地数据存储。
主要特点:
-
单文件存储:整个数据库保存在一个文件中,便于备份与迁移。
-
零配置:无需安装或管理,开箱即用。
-
跨平台:文件格式稳定,承诺兼容至 2050 年。
-
高可靠性:完全支持事务,保证数据一致性。
-
小巧高效:完整功能下小于 400KiB。
典型使用场景:
-
嵌入式设备与物联网(如智能手表、机顶盒、相机等)。
-
低流量网站(日访问量 < 10 万次)。
-
数据分析与脚本处理(支持 CSV/Excel 导入导出)。
-
缓存系统(减少主数据库压力)。
-
内存/临时数据库(快速测试与演示)
二.使用教程
1.创建一个c#项目,然后安装必要的包:
cs
# 3. 安装必要的包
dotnet add package Microsoft.Data.Sqlite
dotnet add package Dapper
2.:创建最简单的模型
创建一个文件 Person.cs:
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
cs
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中调用一次
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, 需要特别小心谨慎,设置好权限,保护数据安全或设置过滤器防止误操作等
cs
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文件夹(见前面章节)
