C# 中使用 SQLite 实现数据查询、删除与 DataGridView 分页显示
1. 引言在桌面应用开发中SQLite 凭借轻量、零配置、单文件存储等优势成为 C# WinForms 项目中非常流行的嵌入式数据库。而 DataGridView 则是展示表格数据最常用的控件。本文将手把手带你实现一个完整的示例使用 SQLite 存储数据在 C# 中实现查询、删除操作并将查询结果分页显示在 DataGridView 控件中。2. 准备工作与环境搭建2.1 安装 NuGet 包在 Visual Studio 中创建 WinForms 项目后通过 NuGet 包管理器安装 SQLite 驱动Install-Package System.Data.SQLite.Core也可以使用微软官方的 Microsoft.Data.SqliteInstall-Package Microsoft.Data.Sqlite本文以System.Data.SQLite为例进行讲解。2.2 引入命名空间在代码文件顶部引入以下命名空间usingSystem;usingSystem.Data;usingSystem.Data.SQLite;usingSystem.Windows.Forms;3. 创建数据库与数据表3.1 初始化数据库我们创建一个用户信息表包含 Id、Name、Age、Email 四个字段publicclassDatabaseHelper{privatestaticstringconnectionStringData Sourcetest.db;Version3;;publicstaticvoidInitializeDatabase(){using(varconnnewSQLiteConnection(connectionString)){conn.Open();stringsql CREATE TABLE IF NOT EXISTS Users ( Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT NOT NULL, Age INTEGER NOT NULL, Email TEXT );;using(varcmdnewSQLiteCommand(sql,conn)){cmd.ExecuteNonQuery();}}}}3.2 插入测试数据为了方便演示分页效果我们插入一些测试数据publicstaticvoidInsertTestData(){using(varconnnewSQLiteConnection(connectionString)){conn.Open();for(inti1;i50;i){stringsqlINSERT INTO Users (Name, Age, Email) VALUES (name, age, email);using(varcmdnewSQLiteCommand(sql,conn)){cmd.Parameters.AddWithValue(name,用户i);cmd.Parameters.AddWithValue(age,20i%30);cmd.Parameters.AddWithValue(email,useriexample.com);cmd.ExecuteNonQuery();}}}}4. 分页查询实现4.1 分页查询的核心 SQLSQLite 使用LIMIT和OFFSET关键字实现分页SELECT*FROMUsersORDERBYIdLIMITpageSizeOFFSEToffset;其中offset (当前页码 - 1) * 每页条数。4.2 查询总记录数分页显示需要知道总共有多少条数据以便计算总页数publicstaticintGetTotalCount(){using(varconnnewSQLiteConnection(connectionString)){conn.Open();stringsqlSELECT COUNT(*) FROM Users;using(varcmdnewSQLiteCommand(sql,conn)){returnConvert.ToInt32(cmd.ExecuteScalar());}}}4.3 分页查询方法publicstaticDataTableGetUsersByPage(intpageNumber,intpageSize){DataTabledtnewDataTable();using(varconnnewSQLiteConnection(connectionString)){conn.Open();stringsqlSELECT * FROM Users ORDER BY Id LIMIT pageSize OFFSET offset;;using(varcmdnewSQLiteCommand(sql,conn)){cmd.Parameters.AddWithValue(pageSize,pageSize);cmd.Parameters.AddWithValue(offset,(pageNumber-1)*pageSize);using(varadapternewSQLiteDataAdapter(cmd)){adapter.Fill(dt);}}}returndt;}5. 删除操作实现5.1 按 Id 删除单条记录publicstaticboolDeleteUser(intid){using(varconnnewSQLiteConnection(connectionString)){conn.Open();stringsqlDELETE FROM Users WHERE Id id;;using(varcmdnewSQLiteCommand(sql,conn)){cmd.Parameters.AddWithValue(id,id);returncmd.ExecuteNonQuery()0;}}}5.2 批量删除publicstaticboolDeleteUsers(int[]ids){using(varconnnewSQLiteConnection(connectionString)){conn.Open();using(vartxconn.BeginTransaction()){try{foreach(intidinids){stringsqlDELETE FROM Users WHERE Id id;;using(varcmdnewSQLiteCommand(sql,conn,tx)){cmd.Parameters.AddWithValue(id,id);cmd.ExecuteNonQuery();}}tx.Commit();returntrue;}catch{tx.Rollback();returnfalse;}}}}6. DataGridView 分页显示6.1 窗体界面设计在窗体上放置以下控件一个DataGridView控件用于显示数据两个Button控件上一页、下一页一个Label控件用于显示当前页码信息一个TextBox控件用于输入每页显示条数。6.2 分页逻辑实现publicpartialclassMainForm:Form{privateintcurrentPage1;privateintpageSize10;privateinttotalPages1;publicMainForm(){InitializeComponent();DatabaseHelper.InitializeDatabase();DatabaseHelper.InsertTestData();LoadPage();}privatevoidLoadPage(){inttotalCountDatabaseHelper.GetTotalCount();totalPages(int)Math.Ceiling((double)totalCount/pageSize);if(currentPage1)currentPage1;if(currentPagetotalPages)currentPagetotalPages;DataTabledtDatabaseHelper.GetUsersByPage(currentPage,pageSize);dataGridView1.DataSourcedt;lblPageInfo.Text$第{currentPage}/{totalPages}页共{totalCount}条;btnPrev.EnabledcurrentPage1;btnNext.EnabledcurrentPagetotalPages;}privatevoidbtnPrev_Click(objectsender,EventArgse){currentPage--;LoadPage();}privatevoidbtnNext_Click(objectsender,EventArgse){currentPage;LoadPage();}}6.3 删除选中行在 DataGridView 中添加删除按钮列或在选中行后点击删除按钮privatevoidbtnDelete_Click(objectsender,EventArgse){if(dataGridView1.SelectedRows.Count0){MessageBox.Show(请先选择要删除的行);return;}intidConvert.ToInt32(dataGridView1.SelectedRows[0].Cells[Id].Value);if(DatabaseHelper.DeleteUser(id)){MessageBox.Show(删除成功);LoadPage();// 刷新当前页}else{MessageBox.Show(删除失败);}}7. 完整运行效果运行程序后DataGridView 会显示第一页的 10 条数据。点击「下一页」按钮可以查看后续数据点击「删除」按钮可以删除选中的记录删除后当前页自动刷新。下面是整体流程的示意图点击下一页点击删除程序启动初始化数据库插入测试数据加载第一页数据DataGridView 显示用户操作currentPage执行 DELETE 语句刷新当前页8. 常见问题与注意事项8.1 分页后删除导致页码越界当删除当前页最后一条数据后当前页可能已经没有数据了。此时需要判断并回退页码if(dataGridView1.Rows.Count0currentPage1){currentPage--;}8.2 大数据量下的性能优化当数据量很大时建议在Id字段上建立索引并避免使用SELECT *只查询需要的字段CREATEINDEXidx_users_idONUsers(Id);8.3 参数化查询防注入始终使用参数化查询参数名而不是拼接 SQL 字符串这是防止 SQL 注入的最佳实践。9. 总结本文通过一个完整的 C# WinForms 示例演示了如何使用 SQLite 实现数据的查询、删除操作并通过LIMIT和OFFSET实现 DataGridView 的分页显示。核心要点包括使用System.Data.SQLite连接 SQLite 数据库通过LIMIT和OFFSET实现高效分页使用参数化查询保证安全性通过页码状态管理实现 DataGridView 的翻页交互。你可以在此基础上扩展搜索、排序、编辑等功能打造一个功能完善的桌面数据管理工具。

相关新闻

cereal 开源 C++ 序列化库深度解析:header-only 时代的“零仪式感“序列化方案

cereal 开源 C++ 序列化库深度解析:header-only 时代的“零仪式感“序列化方案

1. 引言:为什么还需要一个"老派"的序列化库在 Protobuf、flatbuffers、Apache Arrow 等"重量级"序列化方案大行其道的今天,cereal 依然占据着一个不可替代的位置:当你想序列化一个纯 C 对象,却不想写 .proto …

2026/8/29 20:45:06 阅读更多 →
数据库存储过程与函数实战:从基础语法到架构应用全解析

数据库存储过程与函数实战:从基础语法到架构应用全解析

1. 从脚本到程序:为什么我们需要存储过程和函数? 如果你写过SQL,那你肯定熟悉 SELECT * FROM users WHERE id 1; 这样的语句。它们简单直接,一次执行一个任务。但当你面对复杂的业务逻辑时,比如“每月1号凌晨&#…

2026/8/29 20:45:06 阅读更多 →
面向初学者的 Python:从零经验到用 Python 编写第一个有用的程序

面向初学者的 Python:从零经验到用 Python 编写第一个有用的程序

从零经验到用 编写第一个有用的程序一、为什么 是编程新手的最佳选择对好多一心打算踏入编程领域的人来讲, 开头那一步常常是极难的。市面上编程语言多得眼花缭乱, 挑 哪一门当作起始点相当关键。我刚接触之际, 压根对变量、函数是啥一无所知, 也搞不清为啥缩进有着那般重要的意…

2026/8/29 20:45:06 阅读更多 →

最新新闻

Hoppscotch 快速上手指南:5分钟跑起一个开源 API 测试平台

Hoppscotch 快速上手指南:5分钟跑起一个开源 API 测试平台

Hoppscotch 快速上手指南:5分钟跑起一个开源 API 测试平台 【免费下载链接】hoppscotch Open-Source API Development Ecosystem • https://hoppscotch.io • Offline, On-Prem & Cloud • Web, Desktop & CLI • Open-Source Alternative to Postman, Ins…

2026/8/29 22:17:32 阅读更多 →
纯CSS3实现高性能科技感Loading动画

纯CSS3实现高性能科技感Loading动画

简介:Loading动画是现代Web用户体验的关键触点,其本质是通过视觉反馈降低用户等待焦虑。基于CSS3的声明式动画方案,依托GPU硬件加速、合成层渲染与CSS变量系统,实现零JS依赖、高帧率、低CPU占用的加载效果。相比传统JavaScript动画…

2026/8/29 22:17:32 阅读更多 →
uv 自更新完全指南:1 条命令升级、按版本回退与 CI 自动更新

uv 自更新完全指南:1 条命令升级、按版本回退与 CI 自动更新

uv 自更新完全指南:1 条命令升级、按版本回退与 CI 自动更新 【免费下载链接】uv An extremely fast Python package and project manager, written in Rust. 项目地址: https://gitcode.com/GitHub_Trending/uv/uv uv 是用 Rust 编写的极速 Python 包管理器…

2026/8/29 22:17:32 阅读更多 →
BFS算法实战:从蓝桥杯“扩散”题掌握广度优先搜索核心技巧

BFS算法实战:从蓝桥杯“扩散”题掌握广度优先搜索核心技巧

1. 从“扩散”到“BFS”:一道经典国赛题的解题脉络 看到“扩散”这个题目,很多参加过蓝桥杯的同学可能都会心一笑。这道来自第十一届蓝桥杯C国赛的B题,可以说是BFS(广度优先搜索)算法在竞赛中的一个经典应用范本。它不…

2026/8/29 22:17:32 阅读更多 →
前端实习笔试考点全解析:JS基础、闭包、事件循环与Vue备考指南

前端实习笔试考点全解析:JS基础、闭包、事件循环与Vue备考指南

我记得那天晚上,打开在线笔试链接之后,整个人对着一个空荡荡的文本框懵了很久。那道题要求手写一个带防抖功能的函数,并且要正确处理 this 指向和参数透传。日常开发里这不是什么难事,可用处在一个没有自动补全、没有任何提示的…

2026/8/29 22:17:32 阅读更多 →
3 步配好 PowerToys Awake,电脑不再突然休眠

3 步配好 PowerToys Awake,电脑不再突然休眠

3 步配好 PowerToys Awake,电脑不再突然休眠 【免费下载链接】PowerToys Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows 项目地址: https://gitcode.com/GitHub_Trending/po/PowerToys 夜里…

2026/8/29 22:16:32 阅读更多 →

日新闻

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

一、设置环境变量etc目录下的profile.d文件目录 /etc/profile.d1、编写 vi test.sh文件内容# jdk变量 export ZHK_HOME/root export PATH$PATH:$ZHK_HOME/test # 可以取出来ZHK_HOME变量给ZZZ_HOME赋值 export ZZZ_HOME${ZHK_HOME}/test2、刷新 执行source /etc/profile 命令使…

2026/8/29 0:00:24 阅读更多 →
【JavaScript】内存管理-垃圾回收机制-内存泄露

【JavaScript】内存管理-垃圾回收机制-内存泄露

内存管理 C 语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。 而 JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。 整…

2026/8/29 0:00:24 阅读更多 →
Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP 的目标是把 MCP(Model Context Protocol)能力延伸到真实嵌入式硬件实验室:AI Agent 通过一个标准化的 MCP Server,就能查看目标板状态、控制上电断电、复位开发板、读取串口日志,甚至执行镜像刷写。对于经…

2026/8/29 0:00:24 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/29 18:08:35 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/28 23:05:07 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/28 19:47:53 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/29 4:34:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/28 17:43:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/29 2:05:18 阅读更多 →