.版本 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, , )
.如果真结束