【问题描述】 1、过滤表达式清理时,未清理 FValue 的值,造成内存泄露; 2、CopyFrom 的源是一个普通的数据集对象(非 TQDataSet 实例),如果源存在Blob字段,会抛出异常 【严重程度】 高 【更新级别】 推荐 【特别感谢】 阿木、幽灵
分类: QDB
[QDB] 幽灵分享:QDataSet+TQMSSQLConverter 实战技巧
【注】本文由网友 幽灵 分享,由 swish 整理并重新编辑。 1、将A数据库A表的部分数据导入 B数据库B表中 【应用场景】 经常需要将A表的部分数据导入到B库的A表中,以前用循环插入 或是用数据库本身的导入导出,比较耗时,操作麻烦。 【原始做法】 循环插入 [crayon-601145d945b7177755965
[QDB] 使用 TQConverter 直接将数据流从一种格式转换为另一种格式
TQConverter 新增了SaveToConverter / LoadFromConverter 方法来简化数据流格式的转换,支持从流中和文件中转换数据格式后保存到另一个流或文件中。 下面的示例代码演示了: 将当前 FDataSet 数据集的内容使用 TQBinaryConverter 来保存到 ASourceSt
[QDB] 更新:修正了 OpenDataSet 时,如果脚本未返回结果集时未报告错误的问题
【更新说明】 调用 TQProvider.OpenDataSet ,或者是设置数据集的 CommandText,然后打开数据集时,如果指定的脚本没有返回结果集,原来的实现会打开一个没有任何字段的结果集,这实际上是一个错误,本次修改更正了此问题。在检测到这种情况时,返回失败。 【严重程序】 中 【更新级别】 可选
[QDB] 修正了 TQProvider 对多数据集的支持
【更新说明】 1、TQProvider.AddResultSet 函数在被调用时,由于没有检查条件错误,造成可能创建的结果集数量错误,比如类似下面的代码:
1 2 |
if Provider.OpenDataSet(ADataSet,'update table1 set field1=value1 where ...;select * from table1 where field1=value1;select * from table1 where field1=value2;') then .... |
就会生成一个空的结果集,从而出错。 2、TQProvider.AddResultSet 函数在被调
[QDB] 更新-TQSQLConverter 新增多个属性
【更新内容】 1、新增 PrimaryKeyOnly 属性,如果为 True ,则生成的 SQL 脚本的 where 表达式中将只包含主键相关的字段。 2、新增脚本模板相关的属性: InsertTemplate 用于指定生成插入脚本时的模板,注意插入模板中,使用的是 “字段名.New” 这个宏来代表要插入的指定字段的新
[QDB] QDB 新增 TQSQLConverter 的子类来生成更新 SQL 脚本
【注】 TQSQLConverter 新增了多个属性,具体参考:[QDB] 更新-TQSQLConverter 新增多个属性 受制于个人的时间和精力,QDB 的直连的 Provider 目前进展并不如人意。那么在没有 Provider 的情况下,难道就没有办法结合 QDB 和现有的数据库组件来使用了吗?当然不是,QDB
[QDB]新增 TQTextConverter 转换器支持文本格式的数据转换
QDB 新增了一个 TQTextConverter 转换器,只是为了符合习惯,从它上面又继承了一个 TQCSVConverter,实际上,两者是完全等价的(后者直接继承自前者,没有修改任何内容)。 TQTextConverter 相比 TQConverter 新增了以下属性: ExportEncoding 规定导出文本
QDB、QString、QValue、QPlugins 更新说明
【更新内容】 * 修正了QDB、QPlugins 在 2007 无法编译的问题 + QString 增加 StrCmpW 函数(原有增加新参数并移入 interface 部分) + QValue 修正了Bcd 类型操作符在早期版本未重载而引起的编译问题 * 其它细节修改 【更新级别】 推荐 【特别感谢】 麦子仲肥、勇哥
[QDB] 一个新的原生二进制转换器,生成文件的体积最小
QDB 新实现了一个 TQBinaryConverter 做为原生的二进制格式,它的源码位于 qconverter_stds.pas 里,相比 MsgPack、Json 及 FireDAC 的二进制格式,其体积也更小,速度也更快。同样 10 万条记录,下面是几种格式的保存结果对比(均未压缩): TQBinaryCon
[QDB] 更新: 使用 OpenDataSet 从数据库中获取记录时,会设置 CommandText 属性
【更新说明】 CommandText 属性原来没有自动设置,在调用 Provider 的 OpenDataSet 方法时,现在会设置这一属性的值(虽然 QDB 本身不使用它,然并卵?) 【更新级别】 可选
[QDB] QDataSet 支持主从表方式说明
QDataSet 做为 QDB 的重要组成部分,目前已经支持主从表的设定。QDataSet 的主从表支持与一般的数据集略有不同,我做了一些简化和增强处理。设定主从表第一步与一般的数据集没有什么不同,设置从表的 MasterSource 为主表的数据源( DataSource ),但接下来就有所不同了: 1、直接通过设置
[QDB] 三驾马车已就绪,等待您的测试
QDB的三驾马车:TQDataSet、TQConverter、TQProvider 目前都已经可以工作,实际使用过程中可能会有各种Bug,所以暂时不适合用在正式项目中。 1、TQDataSet 内存数据集对象,继承自 TDataSet 并扩展了许多功能。通过使用 TQProvider 的具体子实例(如 TQPgSQLP
[QDB] 从数据库中一次获取多个数据集
QDB 支持一个脚本同时返回多个结果,操作过程也很简单,下面是一段从 PostgreSQL 数据库取出两个不同结果集的示例代码:
1 2 3 4 |
FProv.OpenDataSet(FDataSet, 'select id,char_d from dbtypes order by id;'+ 'select id,abstime_d from dbtypes order by id;' ); |
这样就同时打开了两个结果集,但是,我们只传递了一个数据集对象呀?QDB 如何存的呢?实际上,每一个 TQDataSet 实例
[QDB] QDB 数据交互过程简介
QDB 的开发目前已经基本进入正轨,各项功能完成的七七八八,剩下的主要的问题在于各种转换器和数据提供者的编写工作,就是按需编码了。 现在,我们来了解一下 QDB 与数据库的交互过程,希望能对第三方开发转换器和数据提供者有一些启发作用,更好的将 QDB 应用于实际业务中。 一、数据的获取 QDB 的数据来源有两种: 通过
[QDB] FireDAC->QDB 转换过程中可能存在的问题
FireDAC <-> QDB 之间的转换器目前已经基本就绪,目前已知问题如下: 1、QDataSet 目前不支持数组类型的字段,所以,尝试转换时,相应的字段将无法完成。 2、由于 Extended 类型在 Win32 平台中,占用10个字节,而在其它平台,都等价于 Double 类型。QDB是通过目标编译
[QDB] FireDAC -> QDB 的流转换器正在开发中,目前已经能读取数据
虽然不完善,但是一个好的开始。这个是直接从 FireDAC 的二进制格式解析生成的数据,不需要 FireDAC 相关的单元,通过 TQFDConverter 直接解析文件数据来完成。这样大家在设计手机端程序时,就可以直接用 QDataSet 代替 FireDAC 的相关组件。 要将 FireDAC 的数据
QDB – QDataSet 综合性能测试
【插入速度测试】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
测试 QDAC.TQDataSet... 每万条用时(ms):94.6 97.2 99.4 99.3 104.3 98.7 101.3 101.5 104.4 100.3 总计用时(ms):1001.0 测试 UniDAC.TQDataSet... 每万条用时(ms):116.1 118.1 117.6 117.4 118.6 117.1 117.9 118.9 116.9 118.3 总计用时(ms):1176.9 测试 ADO.TADODataSet... 每万条用时(ms):794.0 779.6 779.0 775.8 753.6 786.9 781.2 791.5 793.6 764.3 总计用时(ms):7799.5 测试 FDAC.TFDMemTable... 每万条用时(ms):99.6 98.1 98.4 97.9 99.2 97.9 98.3 97.8 98.7 98.0 总计用时(ms):983.9 测试 FDAC.TKBMMemTable... 每万条用时(ms):107.3 108.2 112.7 113.0 114.3 110.4 111.6 109.0 109.5 114.7 总计用时(ms):1110.7 测试 DataSnap.TClientDataSet... 每万条用时(ms):162.7 298.5 451.6 559.1 681.1 821.5 969.0 1128.2 1334.3 1855.5 总计用时(ms):8261.5 测试 EhLib.TMemTableEh... 每万条用时(ms):1133.4 2394.9 3567.3 5641.9 6611.8 7974.3 9998.5 11156.7 12858.7 14947.1 总计用时(ms):76284.6 QDAC vs UniDAC:1.18 X QDAC vs ADO:7.79 X QDAC vs FDAC:0.98 X QDAC vs KBM:1.11 X QDAC vs DataSnap:8.25 X QDAC vs EhLib:76.21 X |
【追加速度测试】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
测试 QDAC.TQDataSet... 每万条用时(ms):79.9 81.7 85.5 83.0 82.1 82.2 81.0 81.6 81.2 84.3 总计用时(ms):822.5 测试 UniDAC.TVirtualTable... 每万条用时(ms):111.2 111.3 114.0 111.1 109.4 111.1 109.6 110.7 110.1 110.9 总计用时(ms):1109.4 测试 ADO.TADODataSet... 每万条用时(ms):823.7 833.3 844.1 831.6 821.6 818.3 821.8 819.8 824.3 846.4 总计用时(ms):8284.9 测试 FDAC.TFDMemTable... 每万条用时(ms):98.6 96.8 97.3 98.5 130.3 99.5 98.8 98.0 98.5 97.2 总计用时(ms):1013.5 测试 FDAC.TKBMMemTable... 每万条用时(ms):102.4 101.1 101.8 129.8 107.8 104.6 102.2 102.3 101.5 101.9 总计用时(ms):1055.4 测试 DataSnap.TClientDataSet... 每万条用时(ms):107.0 91.7 87.4 90.0 89.9 89.4 88.5 91.4 93.0 89.0 总计用时(ms):917.3 测试 EhLib.TMemTableEh... 每万条用时(ms):193.8 194.4 197.4 203.1 204.1 194.6 195.7 198.9 199.9 205.1 总计用时(ms):1987.0 QDAC vs UniDAC:1.35 X QDAC vs ADO:10.07 X QDAC vs FDAC:1.23 X QDAC vs KBM:1.28 X QDAC vs DataSnap:1.12 X QDAC vs EhLib:2.42 X |
【定位测试】
1 2 3 4 5 6 7 8 9 10 11 12 13 |
QDAC.Locate 1470.5ms UniDAC.Locate 3146.6ms ADO.Locate 340.7ms FireDAC.Locate 2548.9ms KBM.Locate 3113.4ms DataSnap.Locate 3589.7ms EhLib.Locate 3826.8ms QDAC vs ADO:0.23 X QDAC vs FDAC:1.73 X QDAC vs KBM:2.12 X QDAC vs DataSnap:2.44 X QDAC vs EhLib:2.60 X |
【排序测试】 [crayon-601145d946c9e73950705
[QDB]PostgreSQL 直连性能测试
QDAC.QDB 的 PostgreSQL 直连模块目前已经完成了70%左右功能的开发,所以就做了一个与其它能够连接 PostgreSQL 数据库的组件的性能对比测试,结果如下: 连接初始化的时间我没有进行统计,我们测试 QDAC、UniDAC、FireDAC 三者执行相同脚本所有的时间,以观察其相应的效率对比,为了将
[QDB] PostgreSQL 直接连接打开数据集与 UniDAC 的速度对比
【注】本对比只是一个中间结果,不代表最终稳定测试版结果。连接的是官网服务器上的演示数据库,测试代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
var T1, T2: Int64; I: Integer; begin FProv.ServerHost := 'www.qdac.cc'; FProv.ServerPort := 端口号也藏掉; FProv.UserName := 'qdac'; FProv.Password := '这块密码藏掉了'; FProv.Database := 'QDAC_Demo'; try FProv.Open; UniConnection1.Open; T1 := GetTickCount; FProv.OpenDataSet(FDataSet, 'select * from information_schema.tables'); // T1 := GetTickCount - T1; T2 := GetTickCount; UniQuery1.SQL.Text := 'select * from information_schema.tables'; UniQuery1.Open; T2 := GetTickCount - T2; if FDataSet.Active then begin Memo1.Lines.Add('数据集打开成功,返回:' + IntToStr(FDataSet.RecordCount) + '条记录'); end; Memo1.Lines.Add('QDAC:' + IntToStr(T1) + 'ms'); Memo1.Lines.Add('UniDAC:' + IntToStr(T2) + 'ms'); finally for I := 0 to DBGrid1.Columns.Count - 1 do DBGrid1.Columns[I].Width := 120; if FProv.Connected then begin Memo1.Lines.Add('服务器已连接'); Memo1.Lines.AddStrings(FProv.Params); end else Memo1.Lines.Add('服务器连接失败:' + FProv.LastErrorMsg); end; |
最终的测试结果速度要快于UniDAC,下面是其中一次的测试结果,约快一倍左右。