C# Sqlite帮助类

在 .NET Framework 4.8 中,推荐使用 System.Data.SQLite (由 SQLite.org 官方维护的 ADO.NET 提供程序),而不是 Microsoft.Data.Sqlite(后者主要用于 .NET Core / .NET 5+)。

下面是一个适用于 .NET Framework 4.8 的 同步方式 的 SqliteHelper 类,基于 System.Data.SQLite。


✅ 第一步:安装 NuGet 包

在 Visual Studio 的包管理器控制台中运行:

powershell 复制代码
Install-Package System.Data.SQLite.Core

注意:不要安装 System.Data.SQLite(带设计时组件的完整版),除非你需要 VS 设计器支持。System.Data.SQLite.Core 是纯运行时依赖,更轻量。


📦 引用命名空间

csharp 复制代码
using System;
using System.Data;
using System.Collections.Generic;
using System.Data.SQLite;

🧩 SqliteHelper 类(.NET 4.8 同步版本)

csharp 复制代码
public static class SqliteHelper
{
    private static string _connectionString;

    /// <summary>
    /// 初始化连接字符串
    /// </summary>
    /// <param name="connectionString">例如:"Data Source=app.db;Version=3;"</param>
    public static void Initialize(string connectionString)
    {
        if (string.IsNullOrEmpty(connectionString))
            throw new ArgumentException("连接字符串不能为空", nameof(connectionString));
        _connectionString = connectionString;
    }

    /// <summary>
    /// 执行非查询命令(INSERT, UPDATE, DELETE)
    /// </summary>
    public static int ExecuteNonQuery(string sql, params SQLiteParameter[] parameters)
    {
        using (var connection = new SQLiteConnection(_connectionString))
        {
            connection.Open();
            using (var command = new SQLiteCommand(sql, connection))
            {
                if (parameters != null)
                    command.Parameters.AddRange(parameters);
                return command.ExecuteNonQuery();
            }
        }
    }

    /// <summary>
    /// 执行标量查询(返回第一行第一列)
    /// </summary>
    public static object ExecuteScalar(string sql, params SQLiteParameter[] parameters)
    {
        using (var connection = new SQLiteConnection(_connectionString))
        {
            connection.Open();
            using (var command = new SQLiteCommand(sql, connection))
            {
                if (parameters != null)
                    command.Parameters.AddRange(parameters);
                return command.ExecuteScalar();
            }
        }
    }

    /// <summary>
    /// 执行查询并返回 DataTable
    /// </summary>
    public static DataTable ExecuteDataTable(string sql, params SQLiteParameter[] parameters)
    {
        using (var connection = new SQLiteConnection(_connectionString))
        {
            using (var adapter = new SQLiteDataAdapter(sql, connection))
            {
                if (parameters != null)
                {
                    adapter.SelectCommand = new SQLiteCommand(sql, connection);
                    adapter.SelectCommand.Parameters.AddRange(parameters);
                }
                var table = new DataTable();
                adapter.Fill(table);
                return table;
            }
        }
    }

    /// <summary>
    /// 执行查询并返回 List&lt;Dictionary&lt;string, object&gt;&gt;
    /// </summary>
    public static List<Dictionary<string, object>> ExecuteQuery(string sql, params SQLiteParameter[] parameters)
    {
        var results = new List<Dictionary<string, object>>();
        using (var connection = new SQLiteConnection(_connectionString))
        {
            connection.Open();
            using (var command = new SQLiteCommand(sql, connection))
            {
                if (parameters != null)
                    command.Parameters.AddRange(parameters);

                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var row = new Dictionary<string, object>();
                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            var columnName = reader.GetName(i);
                            var value = reader.IsDBNull(i) ? null : reader.GetValue(i);
                            row[columnName] = value;
                        }
                        results.Add(row);
                    }
                }
            }
        }
        return results;
    }
}

🔧 使用示例

1. 初始化(通常在程序启动时调用一次)

csharp 复制代码
SqliteHelper.Initialize("Data Source=app.db;Version=3;");

如果数据库文件不存在,SQLite 会自动创建。

2. 创建表

csharp 复制代码
SqliteHelper.ExecuteNonQuery(@"
    CREATE TABLE IF NOT EXISTS Users (
        Id INTEGER PRIMARY KEY AUTOINCREMENT,
        Name TEXT NOT NULL,
        Age INTEGER
    )");

3. 插入数据

csharp 复制代码
var nameParam = new SQLiteParameter("@name", "张三");
var ageParam = new SQLiteParameter("@age", 25);
SqliteHelper.ExecuteNonQuery(
    "INSERT INTO Users (Name, Age) VALUES (@name, @age)",
    nameParam, ageParam);

4. 查询数据

csharp 复制代码
var users = SqliteHelper.ExecuteQuery(
    "SELECT * FROM Users WHERE Age > @minAge",
    new SQLiteParameter("@minAge", 18));

foreach (var user in users)
{
    Console.WriteLine($"姓名: {user["Name"]}, 年龄: {user["Age"]}");
}

5. 获取记录数

csharp 复制代码
var count = (long)SqliteHelper.ExecuteScalar("SELECT COUNT(*) FROM Users");
Console.WriteLine($"总用户数: {count}");

⚠️ 注意事项(.NET 4.8 特定)

  • System.Data.SQLite 在 .NET Framework 下需要 x86/x64 本机 DLL (如 SQLite.Interop.dll)。
    安装 System.Data.SQLite.Core NuGet 包后,它会自动将对应平台的 x86 和 x64 文件夹复制到输出目录。
  • 如果你的应用是 AnyCPU ,建议设置为 x64 或 x86,避免部署时找不到 Interop DLL。
  • 不要混用 Microsoft.Data.Sqlite 和 System.Data.SQLite,它们是两个不同的库。

相关推荐
Vertira2 小时前
C# 函数封装成 DLL,
开发语言·c#
浅尝辄止;3 小时前
设计模式在HIS/LIS医疗系统中的完整实践指南(C#版)
开发语言·设计模式·c#
青春逝如流水4 小时前
Java 线程在内存模型(JMM)与 JVM 实现:规范与落地的多元路径
java·开发语言·jvm·多线程·ai文章
kimloner13 小时前
开源一个 376KB 的 Windows 桌面小工具:便签 + 截图标注 + OCR + 待办提醒(C# / WinForms)
windows·开源·c#·ocr·winforms
colinu13 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
wuminyu14 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
阿松爱学习14 小时前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#
半亩码田14 小时前
C#转Python第4.8篇:正则表达式:Python re 模块 vs C# System.Text.RegularExpressions
python·正则表达式·c#
DongQiShanRen14 小时前
玄龙(上):TICK 主循环——意识心跳怎么跳
linux·jvm·数据库·人工智能·数据挖掘·rust
FPGA小徐15 小时前
【一生一芯 / PA】异常响应机制:RISC-V 中 ecall → mtvec → mret 的完整代
开发语言·数据库·c#