Microsoft.Data.Sqlite体验

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) :你截图里选中的那个,其实是原生库打包,不直接写业务,可卸载。
相关推荐
骑着蜗牛撵大象32715 分钟前
MySQL 8.0 迁移后 SQL 变慢:执行计划里 3 类被忽略的成本差异
android·数据库·sql·mysql·优化器·执行计划
ZENERGY-众壹2 小时前
告警风暴怎么压?100MW 电站监控平台告警引擎架构复盘
数据库·架构·iot·电站监控
zhengfei6112 小时前
Go-fastdfs /reload 未授权访问: 有效PoC
数据库·sql
DevOpenClub3 小时前
高考教育信息问答 API:会话参数、资料引用与流式响应
java·数据库·高考
yuanyuan3343 小时前
2026枣庄带检测报告伸缩门品牌测评|本地服务
大数据·数据库·人工智能·伸缩门
wdyan2973 小时前
带着小白学习-微服务-5 实战:配置中心-数据库连接
数据库·学习·微服务
大维4 小时前
DBX 实测:从 SQLite 查询到 MiniMax-M3 自然语言生成 SQL
数据库·sql·sqlite
玖米GEO运营王总监5 小时前
2026年账号矩阵协同效应怎么量化:三个指标与公式结构
java·大数据·数据库
景煜拾年6 小时前
InnoAI SQL 助手
运维·数据库·笔记·sql