数据库 · SQLite
开发专题 · System.Data.SQLite 引用、连接字符串与增删改查
本页说明如何在 .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 中添加引用
- 把
System.Data.SQLite.dll与对应位数的SQLite.Interop.dll放到解决方案内固定目录(例如lib\sqlite\),便于相对路径引用与拷贝工程。 - 在项目浏览器中选中窗体(或控制台)项目 → 右键 → 添加引用(或菜单 项目 → 添加引用)。
- 切换到 .NET集合浏览器 → 浏览(B)...,选中
System.Data.SQLite.dll→ 选择(E) → 确定。 - 确认引用节点下出现该项,属性面板中本地复制为 True。
- 将
SQLite.Interop.dll复制到项目输出目录(与 EXE 同级)。可在资源管理器中手动复制,或把该文件加入项目并设置「复制到输出目录」为「始终复制 / 如果较新则复制」(以属性面板实际文案为准)。 - 菜单 编译 → 编译解决方案(F8),确认无「找不到类型或命名空间」错误。
提示:添加引用的页签与「本地复制」含义见 引用 DLL。平台目标(x86 / x64 / AnyCPU)须与
SQLite.Interop.dll 位数一致,否则运行时报 DllNotFoundException 或 BadImageFormatException。
连接字符串
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 为准(SQLiteConnection、SQLiteCommand、SQLiteParameter、SQLiteDataReader)。
建表(可重复执行)
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.dll 与 SQLite.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 为准;若你改用其他程序集,类型名与连接字符串键可能不同,须对照该包文档。 |
相关阅读
- 引用 DLL — 浏览托管程序集、「本地复制」与常见加载错误
- 数据表单与自定义列 — DataGridView 绑定与自定义列
- 多数据源(多 Access 库文件) — 多个 Access 库文件;文末简述异种混用
- 运行与编译 — 平台目标、输出目录与运行验证
- C# / VB.NET 窗体应用入门 — 可挂接数据库的窗体侧入门