易语言数据库操作:结构化数据管理的核心


易语言数据库操作:结构化数据管理的核心 🗄️

1.7.1 学习目标 🎯

作为文件持久化的进阶替代方案,本节将解决文本文件的致命局限性------「无法高效查询、结构化差、数据一致性弱」,你将达成以下目标:

  1. 用**「超市商品管理系统」生活化类比**彻底理解数据库的核心概念(库/表/字段/记录/索引);
  2. 掌握易语言自带的Access数据库支持库(无需额外安装数据库软件,入门零门槛);
  3. 精通数据库的全流程操作:创建库→建表→增删改查→索引优化→关闭库;
  4. 将前文中的「文本文件版班级成绩管理系统」升级为**「数据库版班级成绩管理系统」**,新增「科目筛选」「成绩排名」「多条件查询」等高级功能;
  5. 排查「数据库连接失败」「字段类型不匹配」「SQL语句错误」等入门阶段高频数据库错误。

1.7.2 核心概念:用「超市商品管理」类比数据库 💡

数据库本质是结构化的磁盘存储系统,用大家熟悉的「超市商品管理」类比:

数据库概念 生活化类比 易语言落地形式
数据库(DB) 超市的「商品档案总库」 后缀为.mdb的Access数据库文件
数据表(Table) 按品类分类的「档案册」(如零食册、饮料册) 数据库中的单个数据表格,用于存储同类型数据
字段(Field) 档案册的「固定条目」(如商品ID、名称、价格、库存) 数据表的列,定义数据类型(整数型/文本型/双精度型)
记录(Record) 单份「商品档案卡片」(如ID=1,可乐,3元,100瓶) 数据表的行,存储一条完整的数据
索引(Index) 档案册的「快速目录」 为字段创建索引,提升查询速度
SQL语句 查找商品的「指令」(如"找所有价格>5元的零食") 用于操作数据库的结构化查询语言

💡 易语言入门福利 :易语言内置**db支持库**,直接支持Access数据库的所有核心操作,无需安装MySQL/PostgreSQL等复杂数据库软件,是入门级结构化数据管理的最优选择!


1.7.3 易语言数据库核心语法详解 📋

(1)环境准备:勾选支持库

打开易语言IDE→「工具」→「支持库配置」→勾选**「数据库操作支持库 (db)」「SQL支持库 (sqllib)」**(用于执行SQL语句),点击「确定」。

(2)数据库创建与打开
① 创建数据库

易语言提供两种创建数据库的方式:可视化创建 (适合入门)和代码创建(适合动态生成)。

  • 可视化创建 :IDE菜单栏→「工具」→「数据库编辑器」→「新建」→选择「Access数据库」→设置字段类型→保存为.mdb文件;
  • 代码创建 :用创建数据库()命令动态生成,示例:
e 复制代码
.局部变量 数据库路径, 文本型 = 取运行目录 () + "\班级成绩.mdb"
.如果真 (创建数据库 (数据库路径, "", "", "Access", ) ≠ 真)  ; 密码留空,使用Access格式
    信息框 ("数据库创建失败!检查路径权限/是否已存在同名文件", 0, "错误提示")
    返回 ()
.如果真结束
② 打开数据库

打开数据库()命令建立与数据库的连接,获得「数据库句柄」(类似文件句柄,用于后续操作):

e 复制代码
.局部变量 数据库句柄, 整数型
数据库句柄 = 打开数据库 (取运行目录 () + "\班级成绩.mdb", "", "", "Access", )
.如果真 (数据库句柄 = 0)  ; 0=连接失败
    信息框 ("数据库连接失败!检查文件是否损坏/路径错误", 0, "错误提示")
    返回 ()
.如果真结束

⚠️ 注意 :打开数据库后必须用关闭数据库()释放句柄,否则会导致数据库文件被永久占用!

(3)数据表创建与结构设计

数据表是数据库的核心,需先定义字段类型 (易语言支持的常用类型:AUTOINCREMENT自动编号、TEXT文本、DOUBLE双精度小数、INTEGER整数)。

执行SQL语句()创建表(入门阶段推荐用SQL,结构清晰):

e 复制代码
.局部变量 SQL语句, 文本型
' 创建成绩表:学生ID自动编号,姓名文本型,5门成绩双精度型
SQL语句 = "CREATE TABLE 成绩表 (" + #换行符 +
            "学生ID AUTOINCREMENT PRIMARY KEY, " + #换行符 +  ; 主键:唯一标识每条记录
            "学生编号 TEXT, " + #换行符 +
            "语文 DOUBLE, " + #换行符 +
            "数学 DOUBLE, " + #换行符 +
            "英语 DOUBLE, " + #换行符 +
            "物理 DOUBLE, " + #换行符 +
            "化学 DOUBLE " + #换行符 +
            ")"
.如果真 (执行SQL语句 (SQL语句) ≠ 真)  ; 执行SQL建表
    信息框 ("表创建失败!检查SQL语句语法", 0, "错误提示")
    关闭数据库 ()
    返回 ()
.如果真结束
(4)核心操作:增删改查
① 插入记录(增)

插入记录()或SQL的INSERT语句,示例:

e 复制代码
' 方式1:用易语言内置命令(适合新手)
插入记录 ("成绩表", "学生编号,语文,数学,英语,物理,化学", "1|95|88|76|62|55")  ; 用|分隔字段值

' 方式2:用SQL语句(适合复杂插入)
SQL语句 = "INSERT INTO 成绩表 (学生编号,语文,数学,英语,物理,化学) VALUES ('2','82','95','79','88','92')"
执行SQL语句 (SQL语句)
② 查询记录(查)

易语言支持可视化查询SQL查询 ,入门阶段推荐用查找记录()或SQL的SELECT语句:

e 复制代码
' 方式1:查找数学成绩≥90的记录
查找记录 ("成绩表", "数学>=90", )  ; 查询到则定位到该记录

' 方式2:用SQL查询(返回所有符合条件的记录)
SQL语句 = "SELECT 学生编号,语文,数学 FROM 成绩表 WHERE 数学>=90 ORDER BY 数学 DESC"  ; 按数学成绩降序
.如果真 (执行SQL语句 (SQL语句) ≠ 真)
    信息框 ("查询失败!", 0, "错误提示")
    返回 ()
.如果真结束
' 循环读取查询结果
.循环判断首 ()
    信息框 ("学生编号:" + 取记录集字段值 ("学生编号") + " 数学:" + 取记录集字段值 ("数学"), 0, )
.循环判断尾 (转到下一条记录 () ≠ 真)  ; 读到最后一条记录则结束
③ 修改记录(改)

修改记录()或SQL的UPDATE语句,示例:

e 复制代码
' 修改学生编号为1的语文成绩为98
SQL语句 = "UPDATE 成绩表 SET 语文=98 WHERE 学生编号='1'"
执行SQL语句 (SQL语句)
④ 删除记录(删)

删除记录()或SQL的DELETE语句,示例:

e 复制代码
' 删除学生编号为3的记录
SQL语句 = "DELETE FROM 成绩表 WHERE 学生编号='3'"
执行SQL语句 (SQL语句)

1.7.4 实操:升级「数据库版班级成绩管理系统」 ⏱️

(1)需求升级与界面设计 🎨

原1.6功能 :成绩保存到TXT、读取、清空;
新升级功能 :① 自动创建Access数据库与成绩表;② 数据库增删改查;③ 科目成绩筛选;④ 总分自动排名;⑤ 多条件查询;
界面新增组件

组件类型 组件名称 核心属性设置
按钮 btn_创建数据库 标题:创建数据库;X:50;Y:480;宽度:120
按钮 btn_删除记录 标题:删除记录;X:200;Y:480;宽度:120
组合框 cb_筛选科目 内容:语文
编辑框 edt_筛选条件 内容:>=90;X:460;Y:480;宽度:80
按钮 btn_筛选查询 标题:筛选;X:550;Y:480;宽度:80
列表框 lb_查询结果 X:50;Y:520;宽度:580;高度:150;允许多行
静态文本框 lbl_数据库路径 标题:数据库路径:;X:50;Y:680;宽度:120
编辑框 edt_数据库路径 只读:真;X:180;Y:680;宽度:450
(2)核心代码编写 ⌨️
e 复制代码
.版本 2
.支持库 spec  ; 标准支持库
.支持库 db  ; 数据库支持库
.支持库 sqllib  ; SQL支持库
.支持库 iext  ; 扩展支持库

.程序集 窗口程序集_启动窗口

' ---------------------- 全局变量与模块化准备 ----------------------
.局部变量 数据库路径, 文本型  ; 数据库文件路径
.局部变量 数据库句柄, 整数型  ; 数据库连接句柄
.局部变量 当前学生数, 整数型 = 0  ; 当前已保存的学生数量
.局部变量 班级成绩数组, 双精度小数型, 数组  ; 内存成绩数组(兼容旧版本)
重定义数组 (班级成绩数组, 假, 10, 5)  ; 初始化内存数组

' ---------------------- 自定义子程序1:初始化环境 ----------------------
.子程序 _启动窗口_创建完毕
' 初始化数据库路径
数据库路径 = 取运行目录 () + "\班级成绩.mdb"
edt_数据库路径.内容 = 数据库路径
' 验证数据库是否存在,不存在则提示创建
.如果真 (文件是否存在 (数据库路径) = 假)
    信息框 ("未检测到数据库文件,请先点击「创建数据库」按钮!", 0, "提示")
.如果真结束
' 兼容旧版本的批量统计按钮
btn_批量统计.可视 = 真

' ---------------------- 自定义子程序2:创建数据库与表 ----------------------
.子程序 创建成绩数据库, 逻辑型
.参数 库路径, 文本型  ; 数据库保存路径
.局部变量 SQL建表语句, 文本型

' 1. 创建数据库文件
.如果真 (创建数据库 (库路径, "", "", "Access", ) ≠ 真)
    信息框 ("数据库创建失败!请检查路径权限或是否存在同名文件", 0, "错误提示")
    返回 (假)
.如果真结束
' 2. 打开数据库
数据库句柄 = 打开数据库 (库路径, "", "", "Access", )
.如果真 (数据库句柄 = 0)
    信息框 ("数据库打开失败!", 0, "错误提示")
    返回 (假)
.如果真结束
' 3. 创建成绩表(包含自动编号主键)
SQL建表语句 = "CREATE TABLE 成绩表 (" + #换行符 +
            "学生ID AUTOINCREMENT PRIMARY KEY NOT NULL, " + #换行符 +
            "学生编号 TEXT (20) NOT NULL, " + #换行符 +
            "语文 DOUBLE DEFAULT 0, " + #换行符 +
            "数学 DOUBLE DEFAULT 0, " + #换行符 +
            "英语 DOUBLE DEFAULT 0, " + #换行符 +
            "物理 DOUBLE DEFAULT 0, " + #换行符 +
            "化学 DOUBLE DEFAULT 0 " + #换行符 +
            ")"
.如果真 (执行SQL语句 (SQL建表语句) ≠ 真)
    信息框 ("成绩表创建失败!SQL语法错误:" + SQL建表语句, 0, "错误提示")
    关闭数据库 ()  ; 失败必须关闭数据库
    返回 (假)
.如果真结束
' 4. 关闭数据库并返回成功
关闭数据库 ()
返回 (真)

' ---------------------- 自定义子程序3:插入成绩到数据库 ----------------------
.子程序 插入成绩到数据库, 逻辑型
.参数 学生编号, 文本型
.参数语文, 双精度小数型
.参数数学, 双精度小数型
.参数英语, 双精度小数型
.参数物理, 双精度小数型
.参数化学, 双精度小数型
.局部变量 SQL插入语句, 文本型

' 打开数据库
数据库句柄 = 打开数据库 (数据库路径, "", "", "Access", )
.如果真 (数据库句柄 = 0)
    信息框 ("数据库连接失败!", 0, "错误提示")
    返回 (假)
.如果真结束
' 拼接SQL插入语句
SQL插入语句 = "INSERT INTO 成绩表 (学生编号,语文,数学,英语,物理,化学) VALUES ('" +
            学生编号 + "','" + 到文本 (语文) + "','" + 到文本 (数学) + "','" +
            到文本 (英语) + "','" + 到文本 (物理) + "','" + 到文本 (化学) + "')"
' 执行插入
.如果真 (执行SQL语句 (SQL插入语句) ≠ 真)
    信息框 ("成绩插入失败!检查学生编号是否重复", 0, "错误提示")
    关闭数据库 ()
    返回 (假)
.如果真结束
' 关闭数据库并更新当前学生数
关闭数据库 ()
当前学生数 = 当前学生数 + 1
返回 (真)

' ---------------------- 自定义子程序4:筛选查询成绩 ----------------------
.子程序 筛选查询成绩, 文本型  ; 返回查询结果的文本
.参数 科目, 文本型  ; 筛选的科目
.参数 条件, 文本型  ; 筛选条件(如>=90、<60)
.局部变量 SQL查询语句, 文本型
.局部变量 查询结果, 文本型
.局部变量 当前记录, 文本型

' 打开数据库
数据库句柄 = 打开数据库 (数据库路径, "", "", "Access", )
.如果真 (数据库句柄 = 0)
    返回 ("数据库连接失败!")
.如果真结束
' 拼接SQL查询语句(按总分降序)
SQL查询语句 = "SELECT 学生编号,语文,数学,英语,物理,化学, (语文+数学+英语+物理+化学) AS 总分 FROM 成绩表 WHERE " +
            科目 + 条件 + " ORDER BY 总分 DESC"
' 执行查询
.如果真 (执行SQL语句 (SQL查询语句) ≠ 真)
    关闭数据库 ()
    返回 ("查询失败!SQL语法错误:" + SQL查询语句)
.如果真结束
' 循环读取查询结果
查询结果 = "学生编号  语文  数学  英语  物理  化学  总分" + #换行符 + "------------------------------" + #换行符
.循环判断首 ()
    当前记录 = 取记录集字段值 ("学生编号") + "    " +
            取记录集字段值 ("语文") + "   " +
            取记录集字段值 ("数学") + "   " +
            取记录集字段值 ("英语") + "   " +
            取记录集字段值 ("物理") + "   " +
            取记录集字段值 ("化学") + "   " +
            取记录集字段值 ("总分")
    查询结果 = 查询结果 + 当前记录 + #换行符
.循环判断尾 (转到下一条记录 () ≠ 真)
' 关闭数据库
关闭数据库 ()
返回 (查询结果)

' ---------------------- 主程序:创建数据库按钮事件 ----------------------
.子程序 _btn_创建数据库_被单击
.如果真 (创建成绩数据库 (数据库路径))
    信息框 ("数据库创建成功!路径:" + 数据库路径, 0, "成功提示")
.如果真结束

' ---------------------- 主程序:保存成绩按钮事件 ----------------------
.子程序 _btn_保存成绩_被单击
.局部变量 学生编号, 文本型
.局部变量语文, 双精度小数型
.局部变量数学, 双精度小数型
.局部变量英语, 双精度小数型
.局部变量物理, 双精度小数型
.局部变量化学, 双精度小数型

' 1. 验证输入合法性(复用前版本代码)
.如果真 (edt_学生编号.内容 = "")
    信息框 ("请输入学生编号!", 0, "错误提示")
    返回 ()
.如果真结束
学生编号 = edt_学生编号.内容
语文 = 到数值 (edt_语文.内容)
数学 = 到数值 (edt_数学.内容)
英语 = 到数值 (edt_英语.内容)
物理 = 到数值 (edt_物理.内容)
化学 = 到数值 (edt_化学.内容)

' 2. 插入到数据库
.如果真 (插入成绩到数据库 (学生编号, 语文, 数学, 英语, 物理, 化学))
    信息框 ("成绩保存成功!已保存" + 到文本 (当前学生数) + "名学生", 0, "提示")
    ' 清空输入框
    edt_学生编号.内容 = ""
    edt_语文.内容 = ""
    edt_数学.内容 = ""
    edt_英语.内容 = ""
    edt_物理.内容 = ""
    edt_化学.内容 = ""
.如果真结束

' ---------------------- 主程序:筛选查询按钮事件 ----------------------
.子程序 _btn_筛选查询_被单击
.局部变量 筛选科目, 文本型
.局部变量 筛选条件, 文本型
.局部变量 查询结果, 文本型

筛选科目 = cb_筛选科目.内容  ; 获取选择的科目
筛选条件 = edt_筛选条件.内容  ; 获取筛选条件
.如果真 (筛选科目 = "" 或 筛选条件 = "")
    信息框 ("请选择科目和筛选条件!", 0, "错误提示")
    返回 ()
.如果真结束
' 执行查询并显示结果
查询结果 = 筛选查询成绩 (筛选科目, 筛选条件)
lb_查询结果.内容 = 查询结果

' ---------------------- 主程序:删除记录按钮事件 ----------------------
.子程序 _btn_删除记录_被单击
.局部变量 学生编号, 文本型
.局部变量 SQL删除语句, 文本型

学生编号 = 输入框 ("请输入要删除的学生编号:", "删除记录", "", , , , , )
.如果真 (学生编号 = "")
    返回 ()
.如果真结束
' 打开数据库
数据库句柄 = 打开数据库 (数据库路径, "", "", "Access", )
.如果真 (数据库句柄 = 0)
    信息框 ("数据库连接失败!", 0, "错误提示")
    返回 ()
.如果真结束
' 拼接SQL删除语句
SQL删除语句 = "DELETE FROM 成绩表 WHERE 学生编号='" + 学生编号 + "'"
.如果真 (执行SQL语句 (SQL删除语句) ≠ 真)
    信息框 ("删除失败!学生编号不存在", 0, "错误提示")
    关闭数据库 ()
    返回 ()
.如果真结束
' 关闭数据库并提示
关闭数据库 ()
当前学生数 = 当前学生数 - 1
信息框 ("删除成功!当前剩余" + 到文本 (当前学生数) + "名学生", 0, "提示")

⌨️

(3)编译与测试流程 🚀

配置支持库 :确保勾选「db」「sqllib」「spec」「iext」支持库;

静态编译 :生成「数据库版班级成绩管理系统.exe」;

测试流程

🔹 创建数据库 :点击「创建数据库」→生成班级成绩.mdb文件,路径显示在界面;

🔹 保存成绩 :输入学生1的成绩→点击「保存成绩」→数据库中插入记录;

🔹 筛选查询 :选择「数学」,输入「>=90」→点击「筛选」→列表框显示数学成绩≥90的学生及总分;

🔹 删除记录 :点击「删除记录」→输入学生1→成功删除并更新当前学生数;

🔹 跨会话验证:关闭程序→重新运行→点击「筛选」→仍能查询到剩余记录(数据已持久化)。


1.7.5 常见问题与解决方案 ⚠️

(1)数据库连接失败

现象 :打开数据库时返回0,提示连接失败;
原因 :① 数据库文件不存在;② 路径包含特殊字符/中文编码问题;③ 数据库文件被其他进程占用;
解决方案

  • 文件是否存在 ()验证路径;
  • 取运行目录 ()获取相对路径;
  • 关闭所有占用数据库的进程(包括易语言IDE、数据库编辑器)。
(2)字段类型不匹配

现象 :插入/修改记录时失败,提示"数据类型不兼容";
原因 :输入的数值类型与表字段定义的类型不一致(如将文本型数据插入到双精度型字段);
解决方案

  • 到数值 ()/到文本 ()转换数据类型;
  • 创建表时明确字段类型,避免模糊定义。
(3)SQL语句语法错误

现象 :执行SQL时失败,提示"语法错误";
原因 :① 字段名/表名用了SQL关键字(如姓名写成name);② 字符串未用单引号包裹;③ 运算符使用错误;
解决方案

  • 避免用SQL关键字作为字段名(可用_姓名代替);
  • 文本型字段必须用单引号包裹(如'学生1');
  • #换行符拆分长SQL语句,便于检查语法。
(4)自动编号字段错误

现象 :插入记录时修改自动编号字段,导致失败;
原因 :自动编号字段是系统自动生成的,不能手动修改
解决方案

  • 插入记录时不要包含自动编号字段;
  • SELECT MAX(学生ID) FROM 成绩表获取最大编号。

1.7.6 本章小结 📌

通过本节学习,你已经掌握了易语言结构化数据管理的核心技术 ------数据库操作,解决了文本文件的局限性:

概念理解 :用「超市商品管理」类比彻底掌握数据库的库/表/字段/记录/索引等核心概念;

语法掌握 :熟练使用易语言自带的Access数据库支持库,完成数据库的全流程操作;

实操能力 :独立开发「数据库版班级成绩管理系统」,实现增删改查、筛选、排名等高级功能;

问题排查 :能够解决数据库连接失败、字段类型不匹配、SQL语法错误等高频错误;

思维升级:从"文本文件的线性存储"升级为"数据库的结构化存储",为后续开发复杂系统打下基础。

下一节将学习易语言的界面美化与组件扩展,让你的系统从"功能可用"升级为"视觉美观、交互友好"。

相关推荐
电子硬件笔记2 小时前
Python语言编程导论第七章 数据结构
开发语言·数据结构·python
南棱笑笑生2 小时前
20251217给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后调通ov5645【只能预览】
linux·c语言·开发语言·rockchip
ulias2122 小时前
C++ 的容器适配器——从stack/queue看
开发语言·c++
Amewin3 小时前
window 11 安装pyenv-win管理不同的版本的python
开发语言·python
lionliu05193 小时前
WebAssembly (Wasm)
java·开发语言·wasm
咸鱼加辣3 小时前
【java面试题】springboot的生命周期
java·开发语言·spring boot
weixin_462446233 小时前
用 Go 快速搭建一个 Coze (扣子)API 流式回复模拟接口(Mock Server)
开发语言·golang·状态模式
小鸡吃米…3 小时前
Python编程语言面试问题二
开发语言·python·面试
谁动了我的代码?4 小时前
QT<34> 利用线程池处理耗时任务以及回调函数的使用
开发语言·qt