推荐使用microsoft.data.sqlite(官方维护、.net 6+原生支持、无需sqlite.interop.dll),system.data.sqlite已停止维护且在.net 6+中兼容性差、易触发error 14。

直接用 Microsoft.Data.Sqlite,别碰 System.Data.SQLite —— 后者已停止维护,且在 .NET 6+ 中兼容性差、容易触发 SQLite Error 14: unable to open database file。
怎么选 NuGet 包:Microsoft.Data.Sqlite vs System.Data.SQLite
现在推荐只用 Microsoft.Data.Sqlite(官方维护,.NET Core / .NET 5+ 原生支持),它不依赖外部 DLL,部署干净。而 System.Data.SQLite 是旧时代产物,需要匹配特定运行时、容易和 Visual Studio 的 SQLite 工具链冲突,尤其在 Windows 上常因权限或路径问题静默失败。
- 安装命令:
dotnet add package Microsoft.Data.Sqlite或通过 VS 的 NuGet 管理器搜索安装 - 不用手动引用 DLL,也不用配置
App.config或provider节点 - 如果项目必须加密(如用 SQLCipher),才需换用
SQLitePCLRaw.bundle_e_sqlcipher+Microsoft.Data.Sqlite.Core,但这是例外,不是默认路径
连接字符串写错导致“no such table”的真实原因
不是 SQL 写错了,而是 Data Source=app.db 指向了一个你没意识到的空文件。因为 SQLite 在文件不存在时会自动创建,而 Environment.CurrentDirectory 在不同启动方式下(双击 exe / VS 调试 / PowerShell 启动)可能完全不同。
- 务必用绝对路径:比如
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "MyApp", "data.db") - 创建前先确保目录存在:
Directory.CreateDirectory(Path.GetDirectoryName(dbPath)) - 调试时加一句:
Console.WriteLine($"DB path: {Path.GetFullPath(dbPath)}");,再用File.Exists()和new FileInfo(dbPath).Length验证文件是否真被写入 - 不要依赖相对路径,哪怕你在代码里写了
"./app.db",也等价于Environment.CurrentDirectory + "\app.db",这个值不可控
建表要不要先查表是否存在?
不需要主动 SELECT count(*) FROM sqlite_master WHERE type='table' AND name='users',直接执行 CREATE TABLE IF NOT EXISTS users (...) 即可。SQLite 本身支持该语法,Microsoft.Data.Sqlite 执行后不会抛异常,返回值是受影响行数(0 表示已存在)。
- 唯一要注意的是:如果想在首次建库时执行初始化逻辑(比如插入默认配置),才需要先查
sqlite_master - 建表语句中避免用双引号包裹列名(如
"id"),SQLite 对大小写敏感,且某些 ORM 会误解析;用反引号或不加引号更稳妥 - 主键推荐显式声明
INTEGER PRIMARY KEY,这样 SQLite 会自动赋予 rowid 行为,查询效率更高
INSERT/UPDATE 总失败?先检查连接对象生命周期
常见错误是把 SqliteConnection 当成单例长期持有,或者在多线程中复用未加锁的连接对象。SQLite 默认以 serialized 模式运行,但连接本身不是线程安全的。
- 每次操作都应新建连接、打开、执行、关闭(用
using最安全) - 不要缓存
SqliteCommand实例,参数绑定后不能跨多次 Execute 复用 - 事务必须显式控制:
using var tx = conn.BeginTransaction(); cmd.Transaction = tx;,否则ExecuteNonQuery()是自动提交的单语句事务 - 如果要批量插入,用
INSERT INTO ... VALUES (...), (...), (...)一条语句代替多次ExecuteNonQuery(),性能能提升 10 倍以上
最易被忽略的一点:SQLite 文件权限在 Windows 上极敏感。放在 Program Files 或 OneDrive 同步目录下,即使路径正确、文件存在,也可能因 UAC 或同步锁导致 unable to open database file —— 不报具体权限错误,只给笼统的 Error 14。动手前先确认目标目录可读写,比调半天 SQL 更省时间。











