☰
C# 中使用 SQLite 实现数据查询、删除与 DataGridView 分页显示
2026/10/31 18:56:29 网站建设 项目流程

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.Sqlite:

Install-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{privatestaticstringconnectionString="Data Source=test.db;Version=3;";publicstaticvoidInitializeDatabase(){using(varconn=newSQLiteConnection(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(varcmd=newSQLiteCommand(sql,conn)){cmd.ExecuteNonQuery();}}}}

3.2 插入测试数据

为了方便演示分页效果,我们插入一些测试数据:

publicstaticvoidInsertTestData(){using(varconn=newSQLiteConnection(connectionString)){conn.Open();for(inti=1;i<=50;i++){stringsql="INSERT INTO Users (Name, Age, Email) VALUES (@name, @age, @email)";using(varcmd=newSQLiteCommand(sql,conn)){cmd.Parameters.AddWithValue("@name","用户"+i);cmd.Parameters.AddWithValue("@age",20+i%30);cmd.Parameters.AddWithValue("@email","user"+i+"@example.com");cmd.ExecuteNonQuery();}}}}

4. 分页查询实现

4.1 分页查询的核心 SQL

SQLite 使用LIMIT和OFFSET关键字实现分页:

SELECT*FROMUsersORDERBYIdLIMIT@pageSizeOFFSET@offset;

其中@offset = (当前页码 - 1) * 每页条数。

4.2 查询总记录数

分页显示需要知道总共有多少条数据,以便计算总页数:

publicstaticintGetTotalCount(){using(varconn=newSQLiteConnection(connectionString)){conn.Open();stringsql="SELECT COUNT(*) FROM Users";using(varcmd=newSQLiteCommand(sql,conn)){returnConvert.ToInt32(cmd.ExecuteScalar());}}}

4.3 分页查询方法

publicstaticDataTableGetUsersByPage(intpageNumber,intpageSize){DataTabledt=newDataTable();using(varconn=newSQLiteConnection(connectionString)){conn.Open();stringsql="SELECT * FROM Users ORDER BY Id LIMIT @pageSize OFFSET @offset;";using(varcmd=newSQLiteCommand(sql,conn)){cmd.Parameters.AddWithValue("@pageSize",pageSize);cmd.Parameters.AddWithValue("@offset",(pageNumber-1)*pageSize);using(varadapter=newSQLiteDataAdapter(cmd)){adapter.Fill(dt);}}}returndt;}

5. 删除操作实现

5.1 按 Id 删除单条记录

publicstaticboolDeleteUser(intid){using(varconn=newSQLiteConnection(connectionString)){conn.Open();stringsql="DELETE FROM Users WHERE Id = @id;";using(varcmd=newSQLiteCommand(sql,conn)){cmd.Parameters.AddWithValue("@id",id);returncmd.ExecuteNonQuery()>0;}}}

5.2 批量删除

publicstaticboolDeleteUsers(int[]ids){using(varconn=newSQLiteConnection(connectionString)){conn.Open();using(vartx=conn.BeginTransaction()){try{foreach(intidinids){stringsql="DELETE FROM Users WHERE Id = @id;";using(varcmd=newSQLiteCommand(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{privateintcurrentPage=1;privateintpageSize=10;privateinttotalPages=1;publicMainForm(){InitializeComponent();DatabaseHelper.InitializeDatabase();DatabaseHelper.InsertTestData();LoadPage();}privatevoidLoadPage(){inttotalCount=DatabaseHelper.GetTotalCount();totalPages=(int)Math.Ceiling((double)totalCount/pageSize);if(currentPage<1)currentPage=1;if(currentPage>totalPages)currentPage=totalPages;DataTabledt=DatabaseHelper.GetUsersByPage(currentPage,pageSize);dataGridView1.DataSource=dt;lblPageInfo.Text=$"第{currentPage}/{totalPages}页(共{totalCount}条)";btnPrev.Enabled=currentPage>1;btnNext.Enabled=currentPage<totalPages;}privatevoidbtnPrev_Click(objectsender,EventArgse){currentPage--;LoadPage();}privatevoidbtnNext_Click(objectsender,EventArgse){currentPage++;LoadPage();}}

6.3 删除选中行

在 DataGridView 中添加删除按钮列,或在选中行后点击删除按钮:

privatevoidbtnDelete_Click(objectsender,EventArgse){if(dataGridView1.SelectedRows.Count==0){MessageBox.Show("请先选择要删除的行!");return;}intid=Convert.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.Count==0&&currentPage>1){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 的翻页交互。

你可以在此基础上扩展搜索、排序、编辑等功能,打造一个功能完善的桌面数据管理工具。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询