
易语言数据库操作:结构化数据管理的核心 🗄️
1.7.1 学习目标 🎯
作为文件持久化的进阶替代方案,本节将解决文本文件的致命局限性------「无法高效查询、结构化差、数据一致性弱」,你将达成以下目标:
- 用**「超市商品管理系统」生活化类比**彻底理解数据库的核心概念(库/表/字段/记录/索引);
- 掌握易语言自带的Access数据库支持库(无需额外安装数据库软件,入门零门槛);
- 精通数据库的全流程操作:创建库→建表→增删改查→索引优化→关闭库;
- 将前文中的「文本文件版班级成绩管理系统」升级为**「数据库版班级成绩管理系统」**,新增「科目筛选」「成绩排名」「多条件查询」等高级功能;
- 排查「数据库连接失败」「字段类型不匹配」「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语法错误等高频错误;
✅ 思维升级:从"文本文件的线性存储"升级为"数据库的结构化存储",为后续开发复杂系统打下基础。