C# 调用 SQLite 数据库完整指南

方予
方予
发布时间:2026-10-14 | 4人浏览过
原创

在 C# 开发中处理少量结构化数据时,直接使用注册表或 XML 效率较低,而大型 DBMS 部署繁琐。SQLite 作为一种无服务器、零配置的嵌入式关系型数据库,凭借单文件存储和轻量级特性成为理想选择。本文将演示如何通过引入 System.Data.SQLite 库,在 C# 中完成连接配置及数据读写操作。

SQLite 简介与应用场景

SQLite 是一个用 C 语言编写的开源嵌入式 SQL 数据库引擎。与传统客户端-服务器模式的大型数据库不同,SQLite 不需要独立的服务器进程,也不涉及复杂的网络通信。

核心特性:

  • 零配置与单文件:整个数据库(包含所有表、视图、索引等)通常只存在一个磁盘文件中,后缀通常为 .db 或 .sqlite。
  • 跨平台:可在 Windows、Linux、macOS 等多种操作系统上运行,无需重新编译即可使用。
  • 轻量级:库体积小,资源占用低,适合桌面应用程序、移动应用(如 Android/iOS)、嵌入式设备及网页浏览器本地存储。
  • 无需账号密码:默认没有用户名和密码机制。安全性依赖于操作系统对数据库文件的访问权限控制,敏感数据建议在应用层加密后存储。

对于需要图形界面管理工具的用户,可使用 DB Browser for SQLite。该工具可直接打开数据库文件进行查看、新建表及执行 SQL 语句,且免安装,仅需双击可执行文件即可启动。

C# 环境准备与引用

C# 原生框架并不直接包含对 SQLite 的支持,需借助第三方适配器。目前最广泛使用的是由 Community Dapper 维护的 System.Data.SQLite 包。

安装步骤:

  1. NuGet 管理:推荐使用 NuGet 包管理器安装,以确保依赖项正确无误。在 Visual Studio 中搜索并安装 System.Data.SQLite。
  2. 添加引用:项目将自动引入核心动态链接库:
    • System.Data.SQLite.dll:基础 ADO.NET 提供者,用于常规 SQL 执行。
    • System.Data.SQLite.Linq.dll:提供 LINQ to Entities 支持,允许使用 LINQ 语法查询数据库。
  3. 命名空间:在代码文件顶部添加引用:
    using System.Data.SQLite;

连接与数据操作详解

在 C# 中操作 SQLite 遵循标准的 ADO.NET 流程:建立连接、创建命令对象、执行操作、读取结果或提交事务。

第 1 步:构建连接字符串与初始化连接

连接字符串指定了数据库文件的路径、是否启用连接池等参数。如果指定的路径不存在,SQLite 驱动会在首次打开连接时自动创建该文件。

// Data Source 是必须的,指定.db文件的全路径。
// FailIfMissing=false 表示如果文件不存在则自动创建;设为 true 则会报错。
string connString = @"Data Source=D:\Data\AppData.db;FailIfMissing=false;Pooling=true;Max Pool Size=5";
SQLiteConnection connection = new SQLiteConnection(connString);
connection.Open();
Console.WriteLine("数据库连接成功开启。");

第 2 步:执行查询与读取数据

使用 SQLiteCommand 发送 SQL 指令并通过 SQLiteDataReader 逐行读取返回结果。读取操作应在 using 块中执行以确保资源被释放。

// 创建命令对象
SQLiteCommand command = connection.CreateCommand();
command.CommandText = "SELECT Name, Age FROM Users WHERE Status = 'Active'";
command.CommandType = CommandType.Text;

try 
{
    // 执行非空检查查询
    using (SQLiteDataReader reader = command.ExecuteReader()) 
    {
        // 检查是否有返回结果
        if (reader.HasRows)
        {
            while (reader.Read()) 
            {
                // 根据列名或索引获取字段值
                string name = reader["Name"].ToString();
                int age = Convert.ToInt32(reader["Age"]);
                Console.WriteLine($"用户: {name}, 年龄: {age}");
            }
        }
        else 
        {
            Console.WriteLine("未找到匹配的记录。");
        }
    }
}
catch (Exception ex) 
{
    Console.WriteLine($"执行出错: {ex.Message}");
}

第 3 步:执行修改、插入或删除操作

对于不返回数据的操作(INSERT, UPDATE, DELETE),使用 ExecuteNonQuery() 方法。

using (var cmd = connection.CreateCommand())
{
    cmd.CommandText = "INSERT INTO Products (ProductName, Price) VALUES (@name, @price)";
    
    // 设置参数化查询以防止 SQL 注入并自动处理类型转换
    cmd.Parameters.AddWithValue("@name", "New Widget");
    cmd.Parameters.AddWithValue("@price", 19.90);

    try
    {
        int rowsAffected = cmd.ExecuteNonQuery();
        Console.WriteLine($"已成功插入 {rowsAffected} 条记录。");
    }
    catch(Exception ex)
    {
        Console.WriteLine($"写入失败: {ex.Message}");
    }
}

第 4 步:使用 LINQ 进行高级查询

若项目中已引入 System.Data.SQLite.Linq.dll,可以定义继承自 SQLiteConnection 上下文或使用特定的 LINQ 提供商类进行更优雅的数据访问(注:具体实现常结合 Entity Framework Core SQLite Provider,此处展示基于标准接口的概念)。

在实际企业级开发中,建议配合 EF Core (Entity Framework Core) 使用 Microsoft.EntityFrameworkCore.Sqlite 插件,这将大幅简化模型映射和 CRUD 逻辑。

常见排错与维护

  • “无法加载 DLL”错误:如果在运行时报错提示缺少 SQLite DLL,通常是针对 x86/x64 架构不匹配导致的。请在项目属性中将“平台目标”设置为特定架构(x86 或 x64),或者确保安装了适配 CPU 架构的 SQLite 运行时组件。
  • 数据库被锁定(Database is locked):当多个线程同时写入数据库,或上一个操作未完全关闭连接/Reader 时可能触发。确保严格使用 using 语句及时释放 Reader 和 Command,避免长时间持有写锁。
  • 数据类型转换异常:SQLite 是弱类型数据库(Typeless),但 C# 强类型。从数据库读取时务必使用 Convert.To...() 或显式转换,以防 DBNull 导致崩溃。

以上就是 C# 调用 SQLite 数据库的详细教程内容,更多关于 C# 数据库开发与优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表