易语言-基础-外部数据库

外部数据库:

外部数据库组件:

ODBC与ADO :

SQL语言

外部数据库组件:

数据库连接和记录集:

记录集组件:

示例连接MYSQL数据库:

复制代码
.版本 2
.支持库 mysql
.支持库 EThread

.程序集 窗口程序集_启动窗口
.程序集变量 数据库, 整数型
.程序集变量 记录集, 整数型
.程序集变量 输入有效, 逻辑型
.程序集变量 连接线程句柄, 整数型
.程序集变量 连接结果, 整数型
.程序集变量 已放弃连接, 逻辑型

.子程序 _按钮_连接数据库_被单击
.局部变量 等待结果, 逻辑型
.局部变量 超时毫秒, 整数型
.局部变量 超时说明, 文本型

超时毫秒 = 5000  ' ★这里就是"连接超时",单位毫秒
超时说明 = "5"

' 1. 已有旧连接先释放,避免反复点按钮造成句柄泄漏
.如果真 (数据库 ≠ 0)
    断开MySql (数据库)
    数据库 = 0
.如果真结束

' 2. 复位状态,启动连接线程
已放弃连接 = 假
连接结果 = 0

.如果真 (取反 (启动线程 (&线程_连接数据库, , 连接线程句柄)))
    信息框 ("创建连接线程失败!", 0, , )
    返回 ()
.如果真结束

' 3. 主线程最多等 超时毫秒,超时不卡界面
等待结果 = 等待线程 (连接线程句柄, 超时毫秒)

.如果真 (取反 (等待结果))
    已放弃连接 = 真
    信息框 ("连接数据库超时(超过 " + 超时说明 + " 秒无响应)!" + #换行符 + "请检查 192.168.15.4 是否可达、防火墙是否放行 3306 端口。", 0, , )
    返回 ()
.如果真结束

' 4. 线程已在超时前正常结束
关闭线程句柄 (连接线程句柄)

.如果 (连接结果 = 1)
    .如果真 (执行SQL语句 (数据库, "SET NAMES 'GBK'") = 假)
        信息框 ("连接成功,但设置字符集失败!", 0, , )
        返回 ()
    .如果真结束
    信息框 ("数据库连接成功!", 0, , )
.否则
    信息框 ("数据库连接失败!请检查服务器端是正常否开启、用户名、密码、库名是否正确!", 0, , )
.如果结束


.子程序 线程_连接数据库
.局部变量 临时句柄, 整数型

临时句柄 = 连接MySql ("192.168.15.4", "test", "123456", "testdb", 3306)

' 阻塞期间主线程已判超时,则本次连接作废并立即释放,防止句柄泄漏
.如果真 (已放弃连接 = 真)
    .如果真 (临时句柄 ≠ 0)
        断开MySql (临时句柄)
    .如果真结束
    返回 ()
.如果真结束

.如果 (临时句柄 = 0)
    连接结果 = 2
.否则
    数据库 = 临时句柄
    连接结果 = 1
.如果结束


.子程序 _按钮_查询数据_被单击
.局部变量 用户名, 文本型
.局部变量 年龄, 文本型
.局部变量 SQL, 文本型
.局部变量 结果文本, 文本型
.局部变量 总行数, 整数型
.局部变量 i, 整数型

.如果真 (数据库 = 0)
    信息框 ("请先连接数据库!", 0, , )
    返回 ()
.如果真结束

编辑框_显示结果.内容 = ""
结果文本 = ""

SQL = "SELECT * FROM users"
.如果真 (执行SQL语句 (数据库, SQL) = 假)
    信息框 ("查询失败!", 0, , )
    返回 ()
.如果真结束

记录集 = 取记录集 (数据库)
.如果真 (记录集 = 0)
    信息框 ("暂无数据!", 0, , )
    返回 ()
.如果真结束

总行数 = 取记录集行数 (记录集)
.如果真 (总行数 ≤ 0)
    释放记录集 (记录集)
    记录集 = 0
    信息框 ("没有数据!", 0, , )
    返回 ()
.如果真结束

.如果真 (到首行 (记录集))
    .计次循环首 (总行数, i)
        读字段值 (记录集, "name", 用户名)
        读字段值 (记录集, "age", 年龄)
        结果文本 = 结果文本 + "用户名:" + 用户名 + "    年龄:" + 年龄 + #换行符
        .如果真 (i < 总行数)
            到下一行 (记录集)
        .如果真结束

    .计次循环尾 ()
.如果真结束

编辑框_显示结果.内容 = 结果文本

释放记录集 (记录集)
记录集 = 0


.子程序 _按钮_插入数据_被单击
.局部变量 SQL, 文本型
.局部变量 用户名, 文本型
.局部变量 年龄, 文本型
.局部变量 是否正在执行, 逻辑型, 静态
.局部变量 影响行数, 整数型
.局部变量 重复检查SQL, 文本型
.局部变量 重复记录集, 整数型
.局部变量 已存在数量, 整数型
.局部变量 计数文本, 文本型

' 防重复点击保护
.如果真 (是否正在执行 = 真)
    返回 ()
.如果真结束
是否正在执行 = 真

.如果真 (数据库 = 0)
    信息框 ("请先连接数据库!", 0, , )
    是否正在执行 = 假
    返回 ()
.如果真结束

' ========== 1. 获取用户名(循环直到输入有效或取消) ==========
输入有效 = 假
.判断循环首 (输入有效 = 假)
    .如果真 (输入框 ("请输入用户名:", "新增用户", , 用户名, , ) = 假)
        ' 用户点击了取消
        是否正在执行 = 假
        返回 ()
    .如果真结束

    用户名 = 删全部空 (用户名)  ' 去除空格

    .如果 (用户名 = "")
        信息框 ("用户名不能为空,请重新输入!", 0, , )
    .否则
        输入有效 = 真  ' 标记为有效,退出循环
    .如果结束


.判断循环尾 ()

' ========== 2. 获取年龄(循环直到输入有效或取消) ==========
输入有效 = 假
.判断循环首 (输入有效 = 假)
    .如果真 (输入框 ("请输入年龄:", "新增用户", , 年龄, , ) = 假)
        ' 用户点击了取消
        是否正在执行 = 假
        返回 ()
    .如果真结束

    年龄 = 删全部空 (年龄)

    .如果 (年龄 = "")
        信息框 ("年龄不能为空,请重新输入!", 0, , )
    .否则
        输入有效 = 真
    .如果结束

.判断循环尾 ()

' 先转义输入内容,避免SQL注入
用户名 = 删全部空 (子文本替换 (用户名, "'", "''", , , 假))
年龄 = 删全部空 (子文本替换 (年龄, "'", "''", , , 假))

' ========== 重复用户名校验代码 ==========
重复检查SQL = "SELECT COUNT(*) FROM users WHERE name='" + 用户名 + "'"
.如果真 (执行SQL语句 (数据库, 重复检查SQL) = 假)
    信息框 ("校验用户名失败!", 0, , )
    是否正在执行 = 假
    返回 ()
.如果真结束
重复记录集 = 取记录集 (数据库)
.如果真 (重复记录集 ≠ 0)
    读字段值 (重复记录集, 0, 计数文本)
    已存在数量 = 到整数 (计数文本)
    释放记录集 (重复记录集)
    重复记录集 = 0
    .如果真 (已存在数量 > 0)
        信息框 ("用户名【" + 用户名 + "】已经存在,不允许重复添加!", 0, , )
        是否正在执行 = 假
        返回 ()
    .如果真结束

.如果真结束

' 执行插入
SQL = "INSERT INTO users (name, age) VALUES ('" + 用户名 + "', '" + 年龄 + "')"

.如果真 (执行SQL语句 (数据库, SQL) = 真)
    影响行数 = 取影响行数 (数据库)
    信息框 ("插入成功!共插入" + 到文本 (影响行数) + "条记录", 0, , )
    _按钮_查询数据_被单击 ()  ' 刷新列表
    是否正在执行 = 假
    返回 ()
.如果真结束

信息框 ("插入失败!", 0, , )
是否正在执行 = 假


.子程序 _按钮_更新数据_被单击
.局部变量 SQL, 文本型
.局部变量 原用户名, 文本型
.局部变量 新用户名, 文本型
.局部变量 新年龄, 文本型
.局部变量 影响行数, 整数型
.局部变量 是否正在执行, 逻辑型, 静态

.如果真 (数据库 = 0)
    信息框 ("请先连接数据库!", 0, , )
    返回 ()
.如果真结束

输入有效 = 假
.判断循环首 (输入有效 = 假)
    .如果真 (输入框 ("请输入原用户名:", "新增用户", , 原用户名, , ) = 假)
        ' 用户点击了取消
        是否正在执行 = 假
        返回 ()
    .如果真结束

    原用户名 = 删全部空 (原用户名)

    .如果 (原用户名 = "")
        信息框 ("原用户名不能为空,请重新输入!", 0, , )
    .否则
        输入有效 = 真  ' 标记为有效,退出循环
    .如果结束


.判断循环尾 ()

输入有效 = 假
.判断循环首 (输入有效 = 假)
    .如果真 (输入框 ("请输入要修改的【新用户名】:", "更新用户", , 新用户名, , ) = 假)
        ' 用户点击了取消
        是否正在执行 = 假
        返回 ()
    .如果真结束

    新用户名 = 删全部空 (新用户名)

    .如果 (新用户名 = "")
        信息框 ("新用户名不能为空,请重新输入!", 0, , )
    .否则
        输入有效 = 真
    .如果结束

.判断循环尾 ()

输入有效 = 假
.判断循环首 (输入有效 = 假)
    .如果真 (输入框 ("请输入要修改的【新年龄】:", "更新用户", , 新年龄, , ) = 假)
        ' 用户点击了取消
        是否正在执行 = 假
        返回 ()
    .如果真结束

    新年龄 = 删全部空 (新年龄)

    .如果 (新年龄 = "")
        信息框 ("新年龄名不能为空,请重新输入!", 0, , )
    .否则
        输入有效 = 真
    .如果结束

.判断循环尾 ()

原用户名 = 删全部空 (子文本替换 (原用户名, "'", "''", , , 假))
新用户名 = 删全部空 (子文本替换 (新用户名, "'", "''", , , 假))
新年龄 = 删全部空 (子文本替换 (新年龄, "'", "''", , , 假))

SQL = "UPDATE users SET name='" + 新用户名 + "', age='" + 新年龄 + "' WHERE name='" + 原用户名 + "'"

.如果真 (执行SQL语句 (数据库, SQL) = 真)
    影响行数 = 取影响行数 (数据库)
    .如果真 (影响行数 = 0)
        信息框 ("未找到用户【" + 原用户名 + "】!", 0, , )
        返回 ()
    .如果真结束
    信息框 ("更新成功!共更新" + 到文本 (影响行数) + "条记录", 0, , )
    _按钮_查询数据_被单击 ()
.如果真结束
.如果真 (执行SQL语句 (数据库, SQL) = 假)
    信息框 ("更新失败!", 0, , )
.如果真结束


.子程序 _按钮_删除数据_被单击
.局部变量 SQL, 文本型
.局部变量 用户名, 文本型
.局部变量 确认, 整数型
.局部变量 影响行数, 整数型
.局部变量 是否正在执行, 逻辑型, 静态

.如果真 (数据库 = 0)
    信息框 ("请先连接数据库!", 0, , )
    返回 ()
.如果真结束

输入有效 = 假
.判断循环首 (输入有效 = 假)
    .如果真 (输入框 ("请输入要删除的用户名:", "删除用户", , 用户名, , ) = 假)
        ' 用户点击了取消
        是否正在执行 = 假
        返回 ()
    .如果真结束

    用户名 = 删全部空 (用户名)
    .如果 (用户名 = "")
        信息框 ("用户名不能为空,请重新输入!", 0, , )
    .否则
        输入有效 = 真
    .如果结束

.判断循环尾 ()

确认 = 信息框 ("确定删除用户【" + 用户名 + "】吗?", 4 + 256, "确认", )
.如果真 (确认 = 7)
    返回 ()
.如果真结束

用户名 = 删全部空 (子文本替换 (用户名, "'", "''", , , 假))
SQL = "DELETE FROM users WHERE name='" + 用户名 + "'"

.如果真 (执行SQL语句 (数据库, SQL) = 真)
    影响行数 = 取影响行数 (数据库)
    .如果真 (影响行数 = 0)
        信息框 ("未找到用户【" + 用户名 + "】!", 0, , )
        返回 ()
    .如果真结束
    信息框 ("删除成功!共删除" + 到文本 (影响行数) + "条记录", 0, , )
    _按钮_查询数据_被单击 ()
.如果真结束
.如果真 (执行SQL语句 (数据库, SQL) = 假)
    信息框 ("删除失败!", 0, , )
.如果真结束
相关推荐
DolphinDB智臾科技1 小时前
告别繁琐解析!BinaryTcp 模块实现沪深 Level‑1 行情接收‑解析‑落库一站式能力
数据库·插件·dolphindb
weixin_404551241 小时前
Oracle SQL 优化知识库:构建方案与价值评估
数据库·sql·oracle
茉莉玫瑰花茶2 小时前
OpenGL [ 基础概念 ]
java·前端·数据库
温暖小土2 小时前
Spring AI 接入 DeepSeek Chat 模型
数据库·人工智能·spring
张小姐的猫2 小时前
【AI大模型接入SDK】 —— 前端页面 & 项目总结与拓展
前端·数据结构·数据库·c++·人工智能·chatgpt
IvorySQL2 小时前
去 IOE 的最后一公里:IvorySQL 5.4 × RISC-V 实测
数据库·人工智能·ai·postgresql·risc-v
-madongyu-3 小时前
HCIE-GaussDB V2.0 笔试考点总览:模块权重、核心要点与高频数字速记
数据库·华为·gaussdb
LRL_3 小时前
Oracle 19c 创建用户并连接 PDB 完整避坑指南
数据库·oracle