[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
.支持库 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 (真)
判断是否输出
测试连接
测试连接参数是否可以顺利连接到数据库。
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 将做为存储过程的参数,进行动态执行。
取回错误
物理连接
通过以下方法,可以使当前对象保留和归还实际的物理连接:
除了调用 锁定连接 方法外,执行数据库事务过程中,连接对象也会自动锁定同一个物理连接,直到事务处理完成。
注意
- 锁定连接 方法在事务处理前调用有效,如果当前连接调用过 开启事务 方法,并且没有提交或者回滚事务时,此时调用锁定连接方法会失败返回 假。
- 执行 锁定连接 方法后,执行事务处理等所有方法,都将沿用 锁定连接 时的同一个物理连接,直到调用 解除锁定 或者 连接对象被释放时,才会归还实际的物理连接。
- 如果连接为局部变量,锁定连接后,可以不用调用“解除锁定”方法,连接对象释放时将自动解除锁定。
事务处理
针对数据库执行相关的事务处理。事务处理可以把一组连续的数据库操作,视为整体进行确认或撤销的操作。一旦执行过程中遇到失败的情况,可以通过“回滚”方法,撤销本次所有操作结果。
相关方法
处理流程
- 首先,执行 连接.开启事务
- 如果单步执行失败,则执行 连接.回滚事务。从开启事务开始到回滚之间的所有(执行)操作都将被撤销
- 如果所有操作都成功,则执行 连接.提交事务。此时将确认所有操作都为有效操作,数据库将执行真实操作
.版本 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: 女
}
特殊情况
-
并非所有的数据库或者表存储引擎都支持事务。
- MySQL中只有 表存储引擎为“InnoDB”时才支持事务
-
驱动版本不匹配可能会导致事务执行失败。
对象映射ORM
E2EE支持数据库对象映射。在易语言中,可以直接映射 表行数据 到 自定义数据类型。易语言目前只支持一对一关联映射,不支持一对多。
绑定映射中心
在执行数据库初始化 连接池.创建 方法时,参数[对象映射中心],可以显式的指定映射中心对象。
注意
如果未指定[对象映射中心]参数,则默认使用 [网站服务器] 参数对象中,服务器默认的对象映射中心。
配置对象映射
映射工具
数据库的对象映射关系,可以使用【E2EE控制中心】> 【映射】 > 【从数据库导入】直接从数据库表结构,自动同步生成映射信息。
数据库同步是增量更新机制。当您实际表结构变化时,可以再次使用【从数据库导入】功能,同步后,手动修改的信息将继续保留和沿用,不会被覆盖。请放心食用。
连接失败
数据库映射工具,使用的是E2EE内的数据库处理机制,所以意味着也是通过ODBC连接数据库的,如果您无法正常使用映射工具连接到您的数据库,请检查是否已经安装好对应版本的驱动:
- [MySQL] MySQL ODBC 3.51 Driver
- [SQLite] SQLite3 ODBC Driver
模块生成
-
点击【E2EE控制中心】>【保存】后,将自动生成以下名称的模块,到网站根目录下:
对象映射模块.ec
-
模块中包含所有对象的 自定义数据类型。
-
模块中包含以下名称开头的 常量:
- #对象_
- 对象名称。可以用于“保存对象”方法时用于对象名的传参
- #表名_
- #字段_
- 字段名。格式为 “字段_” + [对象名] + “_” + [字段昵称]
- #表单_
- 对象表单名:格式为“表单_”+ [对象名]
- 字段表单名:格式为“表单_”+ [对象名] +“_” + [字段昵称]
保存对象
通过 保存对象 方法,可以将 自定义数据/ 键值表 直接保存到数据库,数据库的名称为映射配置的名称。
保存方式
默认机制
保存对象时,默认通过对象的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)
数据库缓存
通过给 连接池 绑定 通用缓存对象,能够很方便的实现数据缓存机制,提高数据库处理的并发能力。
使用流程
大致使用流程如下图:
- 连接池初始化成功时,调用 绑定缓存对象 来关联缓存对象
- 查询前调用 连接.开始查询缓存
- 执行前调用 连接.开始删除缓存