在 .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<Dictionary<string, object>>
/// </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.CoreNuGet 包后,它会自动将对应平台的x86和x64文件夹复制到输出目录。- 如果你的应用是 AnyCPU ,建议设置为 x64 或 x86,避免部署时找不到 Interop DLL。
- 不要混用
Microsoft.Data.Sqlite和System.Data.SQLite,它们是两个不同的库。