cs
using Microsoft.Data.Sqlite;
using System;
class Program
{
static void Main()
{
// 1. 连接字符串(文件不存在会自动创建,Cache=Shared 减少锁冲突)
var connStr = "Data Source=lotus.db;Cache=Shared;";
using var conn = new SqliteConnection(connStr);
conn.Open();
Console.WriteLine($"SQLite 已连接,版本: {conn.ServerVersion}");
// 2. 建表(模拟你之前的 pswddict)
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = @"
CREATE TABLE IF NOT EXISTS pswddict (
ind INTEGER PRIMARY KEY AUTOINCREMENT,
pswd TEXT,
cnt_ok INTEGER
);";
cmd.ExecuteNonQuery();
}
// 3. 插入数据(参数化,防注入)
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO pswddict (pswd, cnt_ok) VALUES (@p, @c);";
cmd.Parameters.AddWithValue("@p", "test_pwd");
cmd.Parameters.AddWithValue("@c", 1);
cmd.ExecuteNonQuery();
}
// 4. 查询(注意:SQLite 的 INTEGER 建议用 GetInt64 接收)
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT ind, pswd, cnt_ok FROM pswddict;";
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
var ind = reader.GetInt64(0);
var pswd = reader.IsDBNull(1) ? null : reader.GetString(1);
var cnt = reader.GetInt32(2);
Console.WriteLine($"ind:{ind}, pswd:{pswd}, cnt_ok:{cnt}");
}
}
// using 结束会自动 Close + Dispose
}
}
⚠️ 关键避坑
| 坑点 | 说明 |
|---|---|
| 没有用户/密码概念 | SQLite 是单文件,没有 MySQL 那套 MigratePSDT@localhost、GRANT 权限。连接串里不需要账号。 |
| 类型弱 | ind 是自增主键,读的时候用 GetInt64(long),别用 GetInt32 防止溢出。 |
| 并发锁 | 多连接写容易 database is locked,加了 Cache=Shared 会好很多;批量写建议放事务里。 |
| 路径 | Data Source=lotus.db 是相对当前工作目录(VS 运行通常是 bin/Debug/netxxx/),建议用绝对路径或 AppContext.BaseDirectory。 |
📦 包的关系速查
Microsoft.Data.Sqlite.Core:纯托管 API,写代码用这个。SQLitePCLRaw.core/provider_e_sqlite3:底层原生引擎,自动依赖,不用管。SQLite(3.54.1) :你截图里选中的那个,其实是原生库打包,不直接写业务,可卸载。
