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#项目,然后安装必要的包:

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文件夹(见前面章节)

相关推荐
新新学长搞科研1 小时前
【广东省博促会主办】2026年第七届先进材料与智能制造国际学术会议(ICAMIM 2026)
大数据·前端·数据库·人工智能·物联网
睡不醒男孩0308231 小时前
CLup篇之PostgreSQL管理
数据库·postgresql
瀚高PG实验室1 小时前
数据库启动报错:42501: 无法打开共享内存段 “/PostgreSQL.******“: 权限不够
数据库·postgresql·瀚高数据库
持敬chijing1 小时前
Web渗透之SQL注入-SQLMAP使用笔记
数据库·sql·安全·web安全·网络安全·网络攻击模型
瀚高PG实验室1 小时前
流复制备库停机维护前检查步骤
数据库·瀚高数据库·highgo
BomanGe21 小时前
NSK直线导轨LH55EL与NH55EM替代指南
前端·javascript·数据库·经验分享·规格说明书
JAVA面经实录9171 小时前
MongoDB(文档型 NoSQL)
java·数据库·mongodb·nosql
睡不醒男孩0308231 小时前
第十篇:PostgreSQL 生产环境高可用选型:CLUP 与 Patroni 深度架构对比与踩坑实录
数据库·postgresql·架构
JAVA面经实录9171 小时前
HBase 知识点梳理(文档型 NoSQL)
大数据·数据库·nosql数据库·hbase