本页说明如何在 .NET Framework 4.8 窗体(或控制台)项目中使用 SQLite:在 LCode 中引用 System.Data.SQLite(或等效托管程序集)、编写连接字符串,以及用 ADO.NET 完成增删改查。操作文案以 LCode 中文界面为准;凡有代码均同时给出 C# 5.0 与 VB.NET。网格绑定与自定义列见 数据表单与自定义列;多 Access 库文件用法见 多数据源(多 Access 库文件)(页内亦简述与 SQLite 异种混用)。

引用哪些 DLL / NuGet 或本地程序集

推荐使用官方 ADO.NET 提供程序 System.Data.SQLite(命名空间同名)。LCode 当前精简版不内置 SQLite 程序集,也不提供「一键安装包」向导;请自行取得程序集后,用「添加引用」浏览加入工程。

文件 / 项 作用
System.Data.SQLite.dll 托管程序集;在 LCode 中添加程序集引用(本地复制建议为 True)
SQLite.Interop.dll 原生互操作库(x86 / x64 各一份)。须与进程位数一致,并出现在 EXE 同目录(输出目录);通常不能只靠「添加引用」自动搞定
NuGet 包 System.Data.SQLite / System.Data.SQLite.Core 在 Visual Studio 等环境可从包还原得到上述 DLL。LCode 主界面 NuGet 包管理暂不支持,待更新完善——请在外部还原或手工下载后,把 DLL 放进解决方案目录再浏览引用

在 LCode 中添加引用

  1. System.Data.SQLite.dll 与对应位数的 SQLite.Interop.dll 放到解决方案内固定目录(例如 lib\sqlite\),便于相对路径引用与拷贝工程。
  2. 在项目浏览器中选中窗体(或控制台)项目 → 右键 → 添加引用(或菜单 项目 → 添加引用)。
  3. 切换到 .NET集合浏览器浏览(B)...,选中 System.Data.SQLite.dll选择(E) → 确定。
  4. 确认引用节点下出现该项,属性面板中本地复制为 True。
  5. SQLite.Interop.dll 复制到项目输出目录(与 EXE 同级)。可在资源管理器中手动复制,或把该文件加入项目并设置「复制到输出目录」为「始终复制 / 如果较新则复制」(以属性面板实际文案为准)。
  6. 菜单 编译 → 编译解决方案F8),确认无「找不到类型或命名空间」错误。
提示:添加引用的页签与「本地复制」含义见 引用 DLL。平台目标(x86 / x64 / AnyCPU)须与 SQLite.Interop.dll 位数一致,否则运行时报 DllNotFoundExceptionBadImageFormatException

连接字符串

SQLite 把整个库存在一个文件里。常用键为 Data Source(库文件路径)与 Version=3。路径可用绝对路径,也可用相对 EXE 的路径;文件不存在时,默认打开连接往往会自动创建空库(以所用程序集版本行为为准)。

连接字符串示例 说明
Data Source=app.db;Version=3; 相对当前工作目录的 app.db(窗体运行时多为输出目录)
Data Source=C:\Data\app.db;Version=3; 绝对路径;注意转义与部署机器路径差异
Data Source=|DataDirectory|\app.db;Version=3; 使用 |DataDirectory| 占位(若已在代码中设置 AppDomain.CurrentDomain.SetData("DataDirectory", ...)
Data Source=app.db;Version=3;Password=秘密; 部分发行版支持库文件口令;是否可用取决于你引用的具体包。勿把口令写死进公开仓库
C#
using System.Data.SQLite;
using System.IO;
using System.Windows.Forms;

// 库文件放在 EXE 旁
string dbPath = Path.Combine(Application.StartupPath, "app.db");
string connStr = "Data Source=" + dbPath + ";Version=3;";

using (SQLiteConnection conn = new SQLiteConnection(connStr))
{
    conn.Open();
    // …执行命令…
}
VB.NET
Imports System.Data.SQLite
Imports System.IO
Imports System.Windows.Forms

' 库文件放在 EXE 旁
Dim dbPath As String = Path.Combine(Application.StartupPath, "app.db")
Dim connStr As String = "Data Source=" & dbPath & ";Version=3;"

Using conn As New SQLiteConnection(connStr)
    conn.Open()
    ' …执行命令…
End Using

增删改查

以下示例假定表 Items 已存在(或首次运行时用 CREATE TABLE IF NOT EXISTS 创建)。参数请用 @Name 占位,避免拼接 SQL。类名以 System.Data.SQLite 为准(SQLiteConnectionSQLiteCommandSQLiteParameterSQLiteDataReader)。

建表(可重复执行)

C#
const string SqlCreate =
    "CREATE TABLE IF NOT EXISTS Items (" +
    "Id INTEGER PRIMARY KEY AUTOINCREMENT, " +
    "Name TEXT NOT NULL, " +
    "Qty INTEGER NOT NULL DEFAULT 0);";

using (SQLiteCommand cmd = new SQLiteCommand(SqlCreate, conn))
{
    cmd.ExecuteNonQuery();
}
VB.NET
Const SqlCreate As String =
    "CREATE TABLE IF NOT EXISTS Items (" &
    "Id INTEGER PRIMARY KEY AUTOINCREMENT, " &
    "Name TEXT NOT NULL, " &
    "Qty INTEGER NOT NULL DEFAULT 0);"

Using cmd As New SQLiteCommand(SqlCreate, conn)
    cmd.ExecuteNonQuery()
End Using

插入(Create)

C#
using (SQLiteCommand cmd = new SQLiteCommand(
    "INSERT INTO Items (Name, Qty) VALUES (@Name, @Qty);", conn))
{
    cmd.Parameters.AddWithValue("@Name", "螺丝");
    cmd.Parameters.AddWithValue("@Qty", 100);
    cmd.ExecuteNonQuery();
}
VB.NET
Using cmd As New SQLiteCommand(
    "INSERT INTO Items (Name, Qty) VALUES (@Name, @Qty);", conn)
    cmd.Parameters.AddWithValue("@Name", "螺丝")
    cmd.Parameters.AddWithValue("@Qty", 100)
    cmd.ExecuteNonQuery()
End Using

查询(Read)

C#
using (SQLiteCommand cmd = new SQLiteCommand(
    "SELECT Id, Name, Qty FROM Items ORDER BY Id;", conn))
using (SQLiteDataReader reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        int id = reader.GetInt32(0);
        string name = reader.GetString(1);
        int qty = reader.GetInt32(2);
        Console.WriteLine(id + "\t" + name + "\t" + qty);
    }
}
VB.NET
Using cmd As New SQLiteCommand(
    "SELECT Id, Name, Qty FROM Items ORDER BY Id;", conn)
    Using reader As SQLiteDataReader = cmd.ExecuteReader()
        While reader.Read()
            Dim id As Integer = reader.GetInt32(0)
            Dim name As String = reader.GetString(1)
            Dim qty As Integer = reader.GetInt32(2)
            Console.WriteLine(id & vbTab & name & vbTab & qty)
        End While
    End Using
End Using

更新(Update)

C#
using (SQLiteCommand cmd = new SQLiteCommand(
    "UPDATE Items SET Qty = @Qty WHERE Id = @Id;", conn))
{
    cmd.Parameters.AddWithValue("@Qty", 120);
    cmd.Parameters.AddWithValue("@Id", 1);
    int rows = cmd.ExecuteNonQuery();
    Console.WriteLine("更新行数: " + rows);
}
VB.NET
Using cmd As New SQLiteCommand(
    "UPDATE Items SET Qty = @Qty WHERE Id = @Id;", conn)
    cmd.Parameters.AddWithValue("@Qty", 120)
    cmd.Parameters.AddWithValue("@Id", 1)
    Dim rows As Integer = cmd.ExecuteNonQuery()
    Console.WriteLine("更新行数: " & rows)
End Using

删除(Delete)

C#
using (SQLiteCommand cmd = new SQLiteCommand(
    "DELETE FROM Items WHERE Id = @Id;", conn))
{
    cmd.Parameters.AddWithValue("@Id", 1);
    cmd.ExecuteNonQuery();
}
VB.NET
Using cmd As New SQLiteCommand(
    "DELETE FROM Items WHERE Id = @Id;", conn)
    cmd.Parameters.AddWithValue("@Id", 1)
    cmd.ExecuteNonQuery()
End Using
填充 DataGridView:可用 SQLiteDataAdapter + DataTable,再赋给 DataGridView.DataSource。列外观与行编辑流程见 数据表单与自定义列(该页以 Access 为主讲,绑定写法可对照迁移)。

注意事项

注意点 说明
原生 DLL 位数 进程与 SQLite.Interop.dll 须同为 x86 或同为 x64。AnyCPU 在 64 位系统上常以 64 位运行。在 LCode 项目选项中对齐平台目标,并确认输出目录中有正确位数的 Interop 文件。
本地复制与部署 发布时除 EXE 外须带上 System.Data.SQLite.dllSQLite.Interop.dll(及依赖的其他托管 DLL,若发行版有拆分)。漏拷贝时运行报找不到程序集或找不到本机 DLL。
工作目录与库路径 相对路径依赖当前工作目录。建议用 Application.StartupPath(窗体)拼绝对路径,避免「在 LCode 里运行正常、从资源管理器双击却找不到库」。
并发与锁 SQLite 以文件锁协调写。多进程或长时间占连接时可能遇到 database is locked;短事务、及时 Dispose/using 关闭连接。
SQL 注入 用户输入一律走参数(@Name),不要字符串拼接进 SQL。
NuGet / 可视化数据源 LCode 主界面 NuGet 包管理、以及「可视化数据库设计器 / 数据源向导」针对 SQLite 的一站式配置暂不支持,待更新完善。请按本页手工引用与手写 ADO.NET。
Microsoft.Data.Sqlite 另一套提供程序(常见于 .NET Core / 较新栈)。在 .NET Framework 4.8 + LCode 场景本手册以 System.Data.SQLite 为准;若你改用其他程序集,类型名与连接字符串键可能不同,须对照该包文档。

相关阅读