资讯动态

在.NET WinForms中创建SQLite数据库

发布时间:2026/11/6 7:52:45 来源:尧图企业网站定制
文章目录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 电脑可直接运行无需配环境。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑