[QDB] QDB 数据交互过程简介

QDB 的开发目前已经基本进入正轨,各项功能完成的七七八八,剩下的主要的问题在于各种转换器和数据提供者的编写工作,就是按需编码了。

现在,我们来了解一下 QDB 与数据库的交互过程,希望能对第三方开发转换器和数据提供者有一些启发作用,更好的将 QDB 应用于实际业务中。

一、数据的获取

QDB 的数据来源有两种:

  • 通过转换器( TQConverter )来获取
    当我们需要从流中将数据加载到数据集对象( TQDataSet )中时,我们需要通过 TQConverter 的某个子类来将数据流的内容转换到数据集中。QDB 中会陆续提供了许多转换器给大家,包括文本文件( CSV、TXT ) 、FireDAC、UniDAC、ADO 等等,具体视需求和空闲时间而定,大家也可以自行编写。
    通过转换器获取时,我们只需要调用 TQDataSet  的 LoadFromStream 或 LoadFromFile 方法,就可以从流或文件中加载数据了。
  • 通过与数据库连接的提供者( TQProvider )来获取
    当我们需要直接从数据库中获取数据时,我们需要通过 TQProvider 的某个具体的子类来完成与数据库的交互工作。我们一般是调用提供者的 OpenDataSet 方法来获得结果集的内容,它会同时设置数据集的 Provider 指向当前实例,以便后面在需要时进行数据更新。
    通过 Provider 与数据库进行交互时,我们必需先建立与数据库的连接。目前系统中实现的只有 PostgreSQL 的 TQPgSQLProvider,可以通过 TQDataSet <-> TQPgSQLProvider 建立与 PostgreSQL 数据库的关联。

二、数据的提交

在我们修改数据后,我们需要将我们的变更内容同步提交给数据库,此时,我们有几种选择:

  • 通过转换器转换为第三方的数据流格式,由第三方提交
    通过 TQDataSet.SaveToStream/SaveToFile 将变更内容保存到数据流中,然后交由第三方相应的组件加载并提交到数据库中
  • 通过与数据库连接的提供者来提交
    通过提供者来提交时,又分为两种情况:
    1、数据集的批量模式( BatchMode )被设置为 True,此时,需要用户自己调用数据集的 ApplyChanges 或提供者的 ApplyChanges 方法来提交,两者是等价的。
    2、非批量模式下,当你删除或调用数据集的 Post 方法提交数据时,TQDataSet 内部会调用数据集的 InternalApplyChanges 函数直接提交到数据库中。如果出现冲突,则会回滚事务并抛出异常。
  • 好吧,实际上我们还有一种选择,TQProvider 支持直接从数据流中提交变更。知道这意味着什么吗?你可以用 QDB 、FireDAC 或者 UniDAC 甚至 ADO 等等在客户端编辑,然后将变更保存到数据流,然后再将数据流提交到服务器,然后调用提供者的 ApplyChanges 直接将流里的变更内容提交到数据库中。是不是感觉有点晕,慢慢你就看懂了。

三、脚本执行

如果要直接执行特定的脚本而不需要返回结果集,在 QDB 中,它是由 ExecuteCmd 方法为您提供的,它有几个重载,你可以视需要进行调用。

四、连接保持

设置 Provider 的 KeepAlive 属性就可以避免连接被服务器自动断开。剩下的一切由 Provider 自动为您处理。

五、按需连接

连接保持会比较消耗服务器的资源,也许按需连接才是你需要的。要按需连接,只需要将 KeepAlive 属性设置为 False 即可。Provider 会在您一段时间不访问数据库时自动断开与服务器的连接,而在您需要访问数据库时重新连接,以降低服务器的负载,缺点就是响应速度上要吃点亏。

分享到: