开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 8776|回复: 6
收起左侧

[教程] [文档2.x] 数据库处理

[复制链接]
发表于 2020-5-16 13:46:51 | 显示全部楼层 |阅读模式   上海市上海市

[E2EE文档2.x] 数据库处理

E2EE的数据库处理功能,主要是基于微软的ADO实现数据库的基本操作。包含以下三个对象:

  • ADODB数据库连接池:连接池
  • ADODB数据库连接:连接对象
  • ADODB数据库分页:分页对象

ADO是基于ODBC封装的处理接口,要使用数据库功能,需要先了解ODBC驱动的概念。

认识ODBC驱动

ODBC驱动是一种数据库操作函数的接口规范。

主流数据库都提供了ODBC驱动的支持。

在操作数据库之前,您首先需要下载您要操作数据库类型的ODBC驱动程序。

E2EE.ODBC集成方案

E2EE.ODBC是一种E2EE内部打包数据库驱动的集成方案。您可以直接使用E2EE.ODBC来安装您的数据库驱动程序。

下载地址:http://e2ee.jimstone.com.cn/downloads/

如果E2EE.ODBC集成的驱动包里,没有您要操作的数据库类型,请自行百度搜索“数据库名ODBC驱动”。需要注意的是,ODBC驱动只针对关系型数据库有效,NoSQL数据库是没有办法通过ODBC进行操作的。

特殊驱动说明

MySQL 5.3 驱动可能会安装失败,安装 5.3驱动前请先安装 VC2015运行库32位

ODBC连接文本

ODBC连接数据库时,数据库参数是通过一串文本描述的,称之为 ODBC连接文本。

一段典型的 ODBC连接文本(MySQL)如下:

DRIVER=MySQL ODBC 3.51 Driver; CHARSET=gbk; SERVER=localhost; PORT=3306; OPTION=4194304; DATABASE=eb; Uid=root; Pwd=1234;
DRIVER

[通用] ODBC驱动名称

SERVER

服务器名称

DATABASE

数据库名称

通过E2EE.ODBC获取连接文本

在E2EE.ODBC集成包里,通常包含了默认的数据库连接文本。您只需要从中修改对应的 服务器、命名空间、用户名 和 密码 等信息即可得到真实的连接文本。

手动获取ODBC连接文本

创建“数据链接”文件

​ 右键选“新建”,创建任意类型的文件,如文本文件,在命名时修改扩展名为udl,例如:db.udl。

​ 提示:如果你无法修改文件的扩展名,请在浏览器中选工具à文件夹选项,取消“隐藏已知文件类型的扩展名”的设置。

连接数据库连接并测试

​ 双击打开db.udl文件,出现如下图所示界面,选择数据库驱动,按“下一步”,到连接界面,根据所选驱动的不同,出现的连接界面也会不同,正确填写相应内容后,按“测试连接”,即可测试所填数据库连接属性的正确性。

取得数据库连接字符串

​ 在程序中可以通过udl文件来连接数据库,当然,直接通过连接字符串更好些。用记事本等文本工具打开db.udl文件,就可以得到刚刚测试成功的连接字符串了,例如:

[oledb]
; Everything after this line is an OLE DB initstring
Provider=MSDASQL.1;Persist Security Info=False;User ID=apa;Data Source=apa
利用这个方法,你就可以快速方便的测试与数据库的连接并得到连接字符串了。

其它方式获取连接文本

其它获取ODBC连接文本的方法请自行百度。

数据库操作基础流程

ADODB数据库连接池

简称 连接池。用于多线程等环境中维护数据库连接使用。

连接池通常为全局变量。在 网站 的 初始化函数 中调用 连接池.创建() 方法进行连接池创建。

连接池初始化

通过 连接池.创建() 方法进行连接池初始化操作。

连接池.创建

参数 说明
服务器对象 传递上下文相关的服务器对象。用于统一输出错误日志等内容。非网站环境也需要传递一个网站对象(不需要启动)。
连接字符串 ODBC连接文本。
数据库类型名称 数据库类型。例如:SQLite、MSSQL、MySQL等。可以为空。为空时,请使用 连接池.配置关键字符号 方法设置相关关键字。
对象映射中心 用于指定 查询对象 和 保存 时使用的对象映射中心。如果为空则从“服务器对象”中获取默认的映射中心对象。
用户名 数据库连接时的用户名。
密码 数据库连接时的密码。
是否UNICODE 如果设置为真,则保存时所有文本都转换为UNICODE进行存储。
连接初始化SQL 连接创建成功后执行的SQL。
取最后ID的SQL 插入数据时获取自增ID的SQL语句。主要用于对象映射保存对象时调用。如果指定过“数据库类型名称”支持的类型,则不需要设置本语句。支持两个转义文本,分别是:“”和“<表>”,使用时可组织类似如下语句:SELECT MAX() FROM <表>。
连接存活周期 连接的最大存活周期(单位:秒)。如果连接超过了指定时间,则在下次获取时将回收并创建新的连接对象。如果为空或者0则使用默认周期(1小时)。如果为 -1 则不进行连接超时策略,只在状态为断开时自动重连(ADO的状态在物理连接断开或者静默断开时,状态位并不保证绝对可靠)。

创建成功返回 真。以下历史版本返回值可能永远为 假,之后的版本已经修复。

  • 2.3.2
.版本 2
.支持库 e2ee

.子程序 数据库初始化, 逻辑型
.参数 错误原因_, 文本型, 参考 可空
.局部变量 连接文本, 文本型

连接文本 = 创建文本 (“Driver=SQLite3 ODBC Driver;Database={1}”, 路径_取运行目录 (“database.db”))
连接池.创建 (_临时服务器, 连接文本, “SQLite”, , , , 真, , , )
返回 (连接池.测试连接 (连接文本, , , 错误原因_))
关于连接的存活周期

MySQL默认为静默断开连接,就是说服务端在判断连接创建时间超过设置的最大时间后,主动断开连接且不会告诉客户端。

MySQL的默认最大连接时间为 8 小时(28800秒)。有些集成数据库的环境(例如PHPStudy等)的周期可能更短(300秒~720秒),这些环境建议重置为8小时。

使用MySQL时,建议 创建 方法的“连接存活周期”参数设置为 3600 秒(1小时)。

取回连接对象

  • 连接池.取连接

从连接池获取一个连接实例。

参数

连接对象 类型为 ADODB数据库连接。要取回的连接对象变量。

输出执行的SQL

设置输出SQL

  • 连接池.置是否输出SQL

设置输出SQL后,将显示具体执行的SQL语句,以及语句执行耗费的时间。

连接池.置是否输出SQL (真)

判断是否输出

  • 连接池.是否输出SQL

测试连接

  • 连接池.测试连接

测试连接参数是否可以顺利连接到数据库。

ADODB数据库连接

简称 连接数据库连接。实际的数据库操作对象。

连接 对象只能通过 连接池.取连接 产生。

连接对象为“抽象”连接

连接 对象为抽象连接,这意味着正常情况下您得到的连接,并非真正的物理连接,只有以下情况下连接才具有物理连接的特性:

  • 连接.锁定连接: 此时锁定当前对象到实际的物理连接
  • 连接.开启事务: 执行事务过程中也将自动锁定为物理连接

除此以外,连接只在执行 查询 或 执行 方法的过程中,会瞬时获取物理连接,得到操作结果后会立即归还真实连接到连接池中。

数据库查询

查询列表

  • 连接.查询

查询结果到第一个参数,类型为 存取列表 变量。列表中的内容为 键值表,其中主键为 字段名,值为 字段值

.版本 2
.支持库 e2ee

.子程序 查询列表
.局部变量 连接, ADODB数据库连接
.局部变量 结果列表, 存取列表

连接池.取连接 (连接)
连接.查询 (结果列表, “SELECT user_id, user_name FROM user”, , , , )
输出调试 (结果列表)
结果列表(存取列表)
[{ user_id: 1, user_name: E2EE }, { user_id: 2, user_name: Jim }]

查询头条

  • 连接.查询头条

查询数据,并将结果中的第一条数据,写入传入的第一个参数变量中。查询失败返回 假,没有结果返回 假,数据类型转换为传入变量的类型失败返回 假。

取回为键值表

查询结果到第一个参数,类型为 通用型 变量,通常输入为键值表变量。当传入结果变量为 键值表 类型时,其中主键为 字段名,值为 字段值

.版本 2
.支持库 e2ee

.子程序 查询头条
.局部变量 连接, ADODB数据库连接
.局部变量 结果, 存取键值表

连接池.取连接 (连接)
连接.查询头条 (结果, “SELECT user_id, user_name FROM user LIMIT 1”, )
输出调试 (结果)
结果(存取键值表)
{ user_id: 1, user_name: E2EE }
取回为指定类型

第一个参数类型为易语言基础数据类型时,将自动尝试转换为传入的数据类型,并且回写到第一个参数,类型转换失败返回 假。

连接.查询头条(结果, "SELECT user_id FROM user LIMIT 1")
结果(整数型)
1

数据库执行

  • 连接.执行

执行主要是执行 更新类型 的SQL语句方法。例如 UPDATE/DELETE/DROP/ALTER 等方法。

.版本 2
.支持库 e2ee

.子程序 数据库执行
.局部变量 连接, ADODB数据库连接

连接池.取连接 (连接)
连接.执行 (“UPDATE user SET age = 24, sex = '人妖' WHERE user_id = 1”, , )
结果
{
  user_id: 1
  age: 24
  user_name: E2EE
  sex: 人妖
}

语句执行成功返回 真。如果返回 假,可通过 连接.取回错误() 获取实际的错误原因。

执行成功时,更新的行数会被写入到参数 更新行数 指定的变量中。

使用传参

数据库查询和执行相关方法中,参数名为 “参数”类型为 键值表,可以用于进行传参执行,避免SQL注入,同时能够解决UNICODE或UTF8参数的保存处理等。

[^键值表UNICODE]: 键值表 和 列表 支持 UNICODE,网页传入、JSON载入 等环境下,存取对象都会保存原始的UNICODE数据。

使用传参时,SQL语句中对应的参数,可以使用 “@” + 键值表主键名称,例如:

示例
.版本 2
.支持库 e2ee

.子程序 使用传参
.局部变量 连接, ADODB数据库连接
.局部变量 参数, 存取键值表

连接池.取连接 (连接)
参数.创建 (“age”, 16, “sex”, “男”, “id”, 1)
连接.执行 (“UPDATE user SET age = @age, sex = home.php?mod=space&uid=54024 WHERE user_id = @id”, 参数, )
结果
{
  user_id: 1
  age: 16
  user_name: E2EE
  sex: 女
}

实际执行会走数据库的 存储过程。age 和 name 将做为存储过程的参数,进行动态执行。

取回错误

  • 连接.取回错误

    取到所有的连接操作的错误详细信息。在连接执行任何操作前,错误都会被清空,如果出现数据库处理异常,错误信息会被填充。存在错误信息则会返回真,并且参数错误原因中会包含详细的错误信息。如果没有错误信息,会返回假。

物理连接

通过以下方法,可以使当前对象保留和归还实际的物理连接:

  • 连接.锁定连接
  • 连接.解除锁定

​ 除了调用 锁定连接 方法外,执行数据库事务过程中,连接对象也会自动锁定同一个物理连接,直到事务处理完成。

注意
  1. 锁定连接 方法在事务处理前调用有效,如果当前连接调用过 开启事务 方法,并且没有提交或者回滚事务时,此时调用锁定连接方法会失败返回 假。
  2. 执行 锁定连接 方法后,执行事务处理等所有方法,都将沿用 锁定连接 时的同一个物理连接,直到调用 解除锁定 或者 连接对象被释放时,才会归还实际的物理连接。
  3. 如果连接为局部变量,锁定连接后,可以不用调用“解除锁定”方法,连接对象释放时将自动解除锁定。

事务处理

​ 针对数据库执行相关的事务处理。事务处理可以把一组连续的数据库操作,视为整体进行确认或撤销的操作。一旦执行过程中遇到失败的情况,可以通过“回滚”方法,撤销本次所有操作结果。

相关方法

  • 连接.开启事务
  • 连接.提交事务
  • 连接.回滚事务

处理流程

  1. 首先,执行 连接.开启事务
  2. 如果单步执行失败,则执行 连接.回滚事务。从开启事务开始到回滚之间的所有(执行)操作都将被撤销
  3. 如果所有操作都成功,则执行 连接.提交事务。此时将确认所有操作都为有效操作,数据库将执行真实操作
.版本 2
.支持库 e2ee

.子程序 事务处理, 逻辑型
.参数 错误原因_, 文本型, 参考 可空
.局部变量 连接, ADODB数据库连接
.局部变量 参数, 存取键值表

连接池.取连接 (连接)

' //  执行前:开启事务
连接.开启事务 ()

参数.创建 (“age”, 20, “sex”, “人妖”, “id”, 1)
.如果真 (连接.执行 (“UPDATE user SET age = @age, sex = @sex WHERE user_id = @id”, 参数, ) = 假)
    连接.取回错误 (错误原因_)
    ' // 失败回滚
    连接.回滚事务 ()
    返回 (假)
.如果真结束

参数.创建 (“age”, 16, “sex”, “女”, “id”, 1)
.如果真 (连接.执行 (“UPDATE user SET age = @age, sex = @sex WHERE user_id = @id”, 参数, ) = 假)
    连接.取回错误 (错误原因_)
    ' // 失败回滚
    连接.回滚事务 ()
    返回 (假)
.如果真结束

' // 全部执行成功: 提交事务
连接.提交事务 ()
返回 (真)
结果
 {
  user_id: 1
  age: 16
  user_name: E2EE
  sex: 女
}

特殊情况

  1. 并非所有的数据库或者表存储引擎都支持事务。

    • MySQL中只有 表存储引擎为“InnoDB”时才支持事务
  2. 驱动版本不匹配可能会导致事务执行失败。

    • 驱动跟数据库版本不匹配时,可能会产生以下提示。

      此*事务*已明地或暗地被确认或*终止*

    • 解决方法:更换版本跟数据库更接近和匹配的32位ODBC驱动。

对象映射ORM

E2EE支持数据库对象映射。在易语言中,可以直接映射 表行数据 到 自定义数据类型。易语言目前只支持一对一关联映射,不支持一对多。

绑定映射中心

在执行数据库初始化 连接池.创建 方法时,参数[对象映射中心],可以显式的指定映射中心对象。

注意

如果未指定[对象映射中心]参数,则默认使用 [网站服务器] 参数对象中,服务器默认的对象映射中心。

配置对象映射

映射工具

​ 数据库的对象映射关系,可以使用【E2EE控制中心】> 【映射】 > 【从数据库导入】直接从数据库表结构,自动同步生成映射信息。

​ 数据库同步是增量更新机制。当您实际表结构变化时,可以再次使用【从数据库导入】功能,同步后,手动修改的信息将继续保留和沿用,不会被覆盖。请放心食用。

连接失败

数据库映射工具,使用的是E2EE内的数据库处理机制,所以意味着也是通过ODBC连接数据库的,如果您无法正常使用映射工具连接到您的数据库,请检查是否已经安装好对应版本的驱动:

  • [MySQL] MySQL ODBC 3.51 Driver
  • [SQLite] SQLite3 ODBC Driver

模块生成

  1. 点击【E2EE控制中心】>【保存】后,将自动生成以下名称的模块,到网站根目录下:

    对象映射模块.ec

  2. 模块中包含所有对象的 自定义数据类型

  3. 模块中包含以下名称开头的 常量

    1. #对象_
      • 对象名称。可以用于“保存对象”方法时用于对象名的传参
    2. #表名_
      • 数据库原始表名称
    3. #字段_
      • 字段名。格式为 “字段_” + [对象名] + “_” + [字段昵称]
    4. #表单_
      • 对象表单名:格式为“表单_”+ [对象名]
      • 字段表单名:格式为“表单_”+ [对象名] +“_” + [字段昵称]

保存对象

通过 保存对象 方法,可以将 自定义数据/ 键值表 直接保存到数据库,数据库的名称为映射配置的名称。

  • 连接.保存对象
  • 连接.保存对象_键值表

保存方式

默认机制

​ 保存对象时,默认通过对象的ID是否为0来决定对象的保存机制:

  • 添加(新增)对象
    • 保存前设置 对象ID为0。保存成功后,对象的ID会被回写到当前对象(自定义数据类型)中
  • 修改对象
    • 保存前设置 对象ID为数据实际ID(非0)。则执行保存时,将执行修改 UPDATE 操作。
显示指定

​ 保存对象相关方法中,指定 [保存模式] 参数,可以指定当前保存是执行的 添加对象 还是 修改对象 操作。

保存对象方法

.版本 2
.支持库 e2ee

.局部变量 连接, ADODB数据库连接
.局部变量 用户, 用户

'// 添加 用户
用户.ID = 0
用户.用户名 = “E2EE”
用户.密码 = “1211”
连接.保存对象 (#对象_用户, 用户) '// 成功时,用户.ID 会被写入为新数据的ID

'// 修改 用户 (指定数据ID为1的数据)
用户.ID = 1
用户.用户名 = “E2EE2”
用户.密码 = “12112”
连接.保存对象 (#对象_用户, 用户)

保存对象 键值表 方法

用户键值表.创建 (#字段_用户_ID, 0, #字段_用户_用户名, “E2EE”, #字段_用户_密码, “1211”)
连接.保存对象_键值表 (#对象_用户, 用户键值表)

用法和 保存对象 完全一致,唯一不同的是,数据是通过 键值表 做为载体的。同样,添加操作时,自增ID会被回写入键值表。

对象键值表 的 主键名 除了可以使用 字段名外,也可以使用对象映射中的 昵称 或者 表单名。

保存成功时,键值表将被统一格式化为 字段名。可以通过 对象映射中心 来格式化为其它类型的名称。

查询对象

​ 为了灵活性和适应不同种类的数据库处理,E2EE中未提供直接的,针对对象的条件查询。实际查询对象时,需要用户自己编写SQL,E2EE会根据SQL结果和指定的对象映射名称匹配,来转换数据为目标数据类型。

  • 连接.查询到自定义数组
  • 连接.查询头条到自定义
.版本 2
.支持库 e2ee

.局部变量 连接, ADODB数据库连接
.局部变量 用户1, 用户
.局部变量 用户数组, 用户, , "0"

连接池.取连接 (连接)
连接.查询到自定义数组 (“SELECT * FROM user”, , , #对象_用户, 用户数组)
连接.查询头条到自定义 (“SELECT * FROM user LIMIT 1”, , #对象_用户, 用户1)

数据库缓存

​ 通过给 连接池 绑定 通用缓存对象,能够很方便的实现数据缓存机制,提高数据库处理的并发能力。

使用流程

​ 大致使用流程如下图:

  1. 连接池初始化成功时,调用 绑定缓存对象 来关联缓存对象
  2. 查询前调用 连接.开始查询缓存
  3. 执行前调用 连接.开始删除缓存

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
结帖率:83% (15/18)

签到天数: 1 天

发表于 2020-12-24 19:42:16 | 显示全部楼层   河南省许昌市
这个很不错!!!
回复 支持 反对

使用道具 举报

签到天数: 10 天

发表于 2020-12-8 16:16:33 | 显示全部楼层   广东省深圳市
一直在用e2ee开发web项目,很给力!
回复 支持 反对

使用道具 举报

结帖率:83% (25/30)

签到天数: 6 天

发表于 2020-11-30 16:28:41 | 显示全部楼层   湖南省怀化市
请问一下. ADODB数据库连接 是非线程安全的, 那在执行update 和 delete 这样的操作时,  我需要额外在前后添加 读写锁吗?
回复 支持 反对

使用道具 举报

结帖率:97% (32/33)
发表于 2020-10-9 14:26:47 | 显示全部楼层   山西省运城市
一直在用e2ee开发web项目,很给力!
回复 支持 反对

使用道具 举报

发表于 2020-5-16 17:36:30 | 显示全部楼层   山东省聊城市
一直在用e2ee开发web项目,很给力!
回复 支持 反对

使用道具 举报

结帖率:86% (6/7)

签到天数: 5 天

发表于 2020-5-16 13:48:13 | 显示全部楼层   河北省唐山市
打破零回复.................
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表