文章目录1、前置环境2、数据的建立3、数据库的访问4、验证与查看数据5、常见问题6、要点汇总1、前置环境安装 SQLite 软件包点击工具栏工具NuGet 包管理器程序包管理器控制台:在控制台输入下载命令Install-Package System.Data.SQLite.Core说明System.Data.SQLite.Core是 .NET Framework / WinForms 项目的首选包安装后自动携带 32/64 位原生引擎SQLite.Interop.dll。也可以走「工具 NuGet 包管理器 管理解决方案的 NuGet 程序包」图形界面搜索安装效果相同。不需要同时安装Microsoft.Data.Sqlite、SQLitePCLRaw.*两套驱动混装会导致无法加载 DLLe_sqlite3报错。2、数据的建立核心思路SQLite 的建库就是创建一个文件连接串指向的文件不存在时会自动创建表结构用CREATE TABLE IF NOT EXISTS在程序启动时执行一次重复运行不会报错也不会清数据。具体步骤1新建一个类文件Db.cs引入命名空间using System.Data.SQLite; using System.IO; using System.Windows.Forms; // 用到 Application.StartupPath2定义数据库文件路径与连接字符串// 数据库文件放在程序运行目录bin\Debug下 private static readonly string DbPath Path.Combine(Application.StartupPath, myapp.db); private static readonly string ConnStr Data Source DbPath ;Version3;;Data Source指向.db文件路径Version3表示使用 SQLite 3 协议。3封装获取连接的方法用完即关SQLite 连接开销极小public static SQLiteConnection GetConnection() { var conn new SQLiteConnection(ConnStr); conn.Open(); return conn; }4编写初始化方法执行建表 SQLpublic static void Init() { using (var conn GetConnection()) using (var cmd conn.CreateCommand()) { cmd.CommandText CREATE TABLE IF NOT EXISTS ...; cmd.ExecuteNonQuery(); } }5在程序入口最先调用一次Init()Program.cs[STAThread] static void Main() { Db.Init(); // 建库 建表必须放在窗体启动之前 Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new For()); }6运行程序bin\Debug\ 目录下出现 myapp.db建库完成。整体代码参考public static class Db { // 数据库文件放在程序目录下 private static readonly string DbPath Path.Combine(Application.StartupPath, myapp.db); private static readonly string ConnStr Data Source DbPath ;Version3;; // 获取连接每次操作用完即关SQLite 开销很小 public static SQLiteConnection GetConnection() { var conn new SQLiteConnection(ConnStr); conn.Open(); return conn; } // 程序启动时调用一次建库 建表 public static void Init() { using (var conn GetConnection()) using (var cmd conn.CreateCommand()) { cmd.CommandText CREATE TABLE IF NOT EXISTS Users ( Id INTEGER PRIMARY KEY AUTOINCREMENT, UserName TEXT NOT NULL UNIQUE, Password TEXT NOT NULL, Phone TEXT, CreatedAt TEXT DEFAULT (datetime(now,localtime)) ); CREATE TABLE IF NOT EXISTS Orders ( Id INTEGER PRIMARY KEY AUTOINCREMENT, UserId INTEGER NOT NULL, Amount REAL NOT NULL, Status TEXT DEFAULT 待处理, FOREIGN KEY (UserId) REFERENCES Users(Id) );; cmd.ExecuteNonQuery(); } } }3、数据库的访问固定套路Db.GetConnection()拿连接 → 建Command→ 写 SQL参数化→ 执行 →using自动释放。1查询填充到 DataGridViewprivate void LoadUsers() { using (var conn Db.GetConnection()) using (var da new SQLiteDataAdapter( SELECT Id AS 编号, UserName AS 用户名, Phone AS 电话, CreatedAt AS 创建时间 FROM Users ORDER BY Id, conn)) { var dt new DataTable(); da.Fill(dt); // 执行查询并填充 dgvUsers.DataSource dt; // 绑定显示 } }2插入注意参数占位禁止字符串拼接using (var conn Db.GetConnection()) using (var cmd conn.CreateCommand()) { cmd.CommandText INSERT INTO Users(UserName, Password, Phone) VALUES(u, p, ph); cmd.Parameters.AddWithValue(u, txtName.Text.Trim()); cmd.Parameters.AddWithValue(p, 123456); cmd.Parameters.AddWithValue(ph, txtPhone.Text.Trim()); int rows cmd.ExecuteNonQuery(); // 返回受影响行数 }3修改using (var conn Db.GetConnection()) using (var cmd conn.CreateCommand()) { cmd.CommandText UPDATE Users SET Phoneph WHERE Idid; cmd.Parameters.AddWithValue(ph, txtPhone.Text.Trim()); cmd.Parameters.AddWithValue(id, id); cmd.ExecuteNonQuery(); }4删除using (var conn Db.GetConnection()) using (var cmd conn.CreateCommand()) { cmd.CommandText DELETE FROM Users WHERE Idid; cmd.Parameters.AddWithValue(id, id); cmd.ExecuteNonQuery(); }5查询单个值登录校验、统计等using (var conn Db.GetConnection()) using (var cmd conn.CreateCommand()) { cmd.CommandText SELECT COUNT(*) FROM Users WHERE UserNameu AND Passwordp; cmd.Parameters.AddWithValue(u, txtName.Text.Trim()); cmd.Parameters.AddWithValue(p, txtPwd.Text.Trim()); long count (long)cmd.ExecuteScalar(); // 返回第一行第一列 if (count 0) MessageBox.Show(登录成功); }三种执行方式的区别执行方法适用场景返回值ExecuteNonQuery()INSERT / UPDATE / DELETE、建表受影响行数ExecuteScalar()COUNT / MAX / 取单个字段第一行第一列object需强转ExecuteReader()/SQLiteDataAdapter.Fill()SELECT 多行多列读取器 / DataTable4、验证与查看数据.db文件不能用记事本或 Visual Studio 直接打开是二进制文件打开是乱码需用专用工具DB Browser for SQLite免费开源https://sqlitebrowser.org打开bin\Debug\myapp.db「数据库结构」页看表、「浏览数据」页看记录。查看前建议先关闭程序避免 SQLite 文件锁导致database is locked。5、常见问题1System.DllNotFoundException无法加载 DLLe_sqlite3原因是项目里混装了两套 SQLite 驱动或原生 DLL 未复制到输出目录。处理卸载全部 SQLite 相关包后只装一个。Uninstall-PackageMicrosoft.Data.Sqlite-ForceUninstall-PackageSQLitePCLRaw.bundle_e_sqlite3-ForceUninstall-PackageSQLitePCLRaw.core-ForceInstall-PackageSystem.Data.SQLite.Core生成后确认bin\Debug\x86\SQLite.Interop.dll与bin\Debug\x64\SQLite.Interop.dll均存在。2no such table: UsersDb.Init()没有被调用或调用晚于查询。确认它在Program.Main()的第一行。3database is locked另一个进程如 DB Browser占用了文件或连接未关闭。坚持用using包裹连接。4数据被清空/表丢失不要用CREATE TABLE无IF NOT EXISTS加DROP TABLE的组合做初始化也不要把bin\Debug\myapp.db当作临时文件删除——它就是正式数据。6、要点汇总SQLite 是嵌入式数据库无需安装 SQL Server、MySQL 等数据库服务NuGet 装包即可。建库 建文件连接串指向的.db不存在时自动创建。建表语句必须带IF NOT EXISTS保证程序重复启动安全。SQL 值一律用参数AddWithValue防注入、防单引号报错。连接一律using包裹用完即关。数据库文件随程序发布拷到任何 Windows 电脑可直接运行无需配环境。
企业数字化 ERP 产品动态
相关推荐
SpringAiAlibaba学习笔记:MCP实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 7:52:32
WebSocket基本知识(附带@ServerEndpoint注解) /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 7:51:32
学习笔记(策略梯度) 前文所述方法都是基于value进行评估,现在我们转向policy,并有值近似转向策略近似。Basic idea of policy gradient在先前,策略是用表格来表示的,我们可以直观地取出或改变表格的值。现在,策略可以用参数方程表示&#… · 2026/11/6 7:51:32
基于CDC的MySQL实时数据同步方案实践 1. 项目背景与核心价值 在数据驱动的业务场景中,数据库表间数据同步是个高频需求。我最近在电商订单系统中就遇到了这个问题:订单主表数据变更后,需要实时同步到统计分析表和风控表。传统的手动同步或定时任务方式存在延迟高、易出错的问题&a… · 2026/11/6 14:00:34
JSP农贸交易系统开发与智能撮合算法实践 ## 1. 项目概述与核心价值农贸产品交易系统是连接农产品生产端与消费端的重要数字化桥梁。这个基于JSP技术的交易平台(项目编号g3608)完整包含了程序源码、数据库设计、部署指南和开发环境配置,是一套开箱即用的农产品B2B解决方案。我在参与某… · 2026/11/6 14:00:34
2025年3D建模工具选型实战指南:按工作流断点匹配生产力 1. 这不是选软件,是选你未来三年的“数字手”——为什么2025年建模工具选择比以往任何时候都更关键 2025年做3D建模,你面对的早已不是“用哪个软件画个模型”这么简单的事。它直接决定你能不能接单、能不能按时交付、能不能把想法一秒变现实、甚至决定你… · 2026/11/6 14:00:34
Qt飞机大战源码解析:QGraphicsView游戏循环与碰撞检测实战 简介:这份资源是面向Qt初学者与游戏开发入门者的「飞机大战」完整项目源码包,围绕Qt框架在经典空战游戏中的实际应用展开,可用于课程设计、自学练手或二次开发参考。压缩包共223个文件,约6.21MB,以105个C头文件与32个c… · 2026/11/6 14:00:34
老旧CMS的XSS与getshell风险防护及应急治理 项目中遇到过不少次类似的场面:群里忽然冒出一条消息,标题写得耸人听闻,核心关键词是 XSS 、 0day 、 通杀所有版本 ,还带着一个"可 getshell"的尾巴,配图往往是半个命令行窗口。消息传得飞快… · 2026/11/6 13:56:30
BOM多视图与版本基线:NX装配映射、大树性能及状态权限实践 BOM 这两个字,在研发产品设计管理平台这个圈子里出现频率极高,但真正把它做扎实的项目并不多。我参与过的这套基于 NX 的平台,第一版已经把设计 BOM 从三维装配里抽了出来,能按树展开、能导出表格、能看图号,当时团队觉… · 2026/11/6 13:56:30
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23
三菱PLC数据采集到数据库的时序设计:Python+MC协议实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11
ASIC主模式RTL设计:状态机与三态驱动的流片级实现 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11
STM32嵌入式C++开发:GDB调试与Renode仿真实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23