[QDB] 幽灵分享:QDataSet+TQMSSQLConverter 实战技巧
转载自QDAC官网网站,文章发现问题可能随时更新,最新版本请访问:
http://blog.qdac.cc/?p=3066
【注】本文由网友 幽灵 分享,由 swish 整理并重新编辑。
1、将A数据库A表的部分数据导入 B数据库B表中
【应用场景】
经常需要将A表的部分数据导入到B库的A表中,以前用循环插入 或是用数据库本身的导入导出,比较耗时,操作麻烦。
【原始做法】
循环插入
AdoQueryM.sql.text:=’select * from A表’;
AdoQueryM.sql.Open;
With AdoQueryM do begin
First;
while not Eof do begin
Inc(K);
AdoQueryD.Append;
for i:=0 to FieldCount-1 do
begin
AdoQueryD.FieldByName(Fields[i].FieldName).Value:=fieldByName(Fields[i].FieldName).Value ;
end;
AdoQueryD.Post;
Application.ProcessMessages;
Next;
end;
end;
【QDB】
AdoQueryM.sql.text:=’select * from A表’;
AdoQueryM.sql.Open;
vQDataSet.CopyFrom(AdoQueryM);
for i := 0 to vQDataSet.FieldDefs.Count-1 do
begin
TQFieldDef(vQDataSet.FieldDefs[i]).Table:=’ A表’;
end;
adoMssql:=TQMSSQLConverter.Create(nil); //转换器
adoMssql.AllAsInsert:=true;
adomssql.DataSet:=vQDataSet;
ConnDB.Execute(adomssql.sql); //B数据库的连接
采用QDB的方法来转换数据,速度要比原始方法快了好几倍。
2、只复制指定列的内容到数据库
A表有50多个列,但自己只需要导入5个列到数据库中 ,QDB只需要将上面 1 中的
vQDataSet.CopyFrom(AdoQueryM);
改为:
vQDataSet.CopyFrom(adoquery1,’序号,编码,名称,状态,部门’);
既可。
3、大数据导入技巧-分页批量导入
【应用场景】
某表有10万行记录需要导入,非常耗时。
【解决方案】
采用QDataset的分页算法,批量插入
SQLDataSet ,vData:TQDataSet;
adoMssql:=TQMSSQLConverter.Create(nil); //各种转换器
vData.PageSize:=1000;
for i := 0 to vData.PageCount-1 do
begin
vData.PageIndex:=i;
SQLDataSet.CopyFrom(vData,dcmview); //获取指定页的数据
adomssql.DataSet:=SQLDataSet;
conDB.Execute(adomssql.sql);
end;
4、本地ClientDataSet的日志文件导入到数据库
【应用场景】
本地有很多ClientDataSet产生的日志文件,需要导入到数据库中
【解决方案】
(1)、根据ClientDataSet的日志,动态产生表结构
procedure TableCreate(vfn:string;vData:TQDataSet);
var
ADataset:TQDataSet;
i:Integer;
s,sql:string;
begin
conDB.execute('if object_id(N'''+vfn+ ''',N''u'') is not null drop table '+vfn);
ADataSet:=TQDataSet.Create(nil);
sql:=Format('Create table %s (',[vfn])+slinebreak;
try
ADataset.Clone(vData);
for i:=0 to ADataset.Fields.Count-1 do
begin
if ADataset.Fields[i].DataType in [ftString, ftMemo, ftFmtMemo, ftWideString] then
begin
s:=' varchar('+inttostr(ADataset.Fields[i].DataSize)+')'
end
else if ADataset.Fields[i].DataType in[ftSmallint, ftInteger, ftWord, ftAutoInc] then s:=' integer'
else if ADataset.Fields[i].DataType in[ftLargeInt] then
s:=' bigint'
else if ADataset.Fields[i].DataType=ftCurrency then
s:=' money'
else if ADataset.Fields[i].DataType in [ftDate, ftTime, ftDateTime] then
s:=' datetime'
else if ADataset.Fields[i].DataType in [ftBoolean] then
s:=' bit'
else if ADataset.Fields[i].DataType in [ftBCD] then
s:=' money'
else
s:=' money';
sql:=' '+sql+ADataset.Fields[i].FieldName+s+',';
end;
sql:=Copy(sql,1,Length(sql)-1)+')';
conDB.execute(sql);
finally
// ADataSet.Free;
end;
end;
(2)、使用QDataSet+转换器 产生SQL语句并执行
ClientDataSetM.LoadFromFile(‘日志文件’);
vData.CopyFrom(ClientDataSetM);
--分页导入数据
SQLDataSet:=TQDataSet.Create(nil);
vData.PageSize:=1000;
for i := 0 to vData.PageCount-1 do
begin
vData.PageIndex:=i;
SQLDataSet.CopyFrom(vData,dcmview); //获取指定页的数据
adomssql.DataSet:=SQLDataSet;
conDB.Execute(adomssql.sql);
end;
----------------------------------------------
QDAC 开源数据库访问组件欢迎大家关注讨论和使用 官网(博客):
http://www.qdac.cc;讨论QQ群:250530692 QLang 多语言组件快速让你的程序走向海外
[QDB] 幽灵分享:QDataSet+TQMSSQLConverter 实战技巧的更多相关文章
- Unity User Group 北京站图文报道:《Unity虚拟现实实战技巧》
时间来到了盛夏,北京UUG活动也来到了第八期.本次活动的主题为<Unity虚拟现实实战技巧>,为此我们邀请了4位资深的行业大神.这次我们仍然在北京市海淀区丹棱街5号微软大厦举行活动,在这里 ...
- C#并行Parallel编程模型实战技巧手册
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...
- Android实战技巧:深入解析AsyncTask
AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...
- webpack快速入门——实战技巧:watch的正确使用方法,webpack自动打包
随着项目大了,后端与前端联调,我们不需要每一次都去打包,这样特别麻烦,我们希望的场景是,每次按保存键,webpack自动为我们打包,这个工具就是watch! 因为watch是webpack自带的插件, ...
- webpack快速入门——实战技巧:开发和生产并行设置
package.json中,devDependencies和dependencies是不同的 devDependencies:开发依赖 dependencies:生产依赖(线上) 1.安装生产环境的依 ...
- webpack快速入门——实战技巧:webpack模块化配置
首先在根目录,新建一个webpack_config文件夹,然后新建entry_webpack.js文件,代码如下: const entry ={}; //声明entry变量 entry.path={ ...
- webpack快速入门——实战技巧:优雅打包第三方类库
下面说两种方法: 一. 1.引入jQuery,首先安装: cnpm install --save jquery 2.安装好后,在我们的entry.js中引入: import $ from 'jquer ...
- webpack快速入门——实战技巧:webpack优化黑技能
1.抽离jquery,vue(多个第三方类库抽离) 修改入口文件(webpack.config.js中) entry: { entry: './src/entry.js', jquery:'jquer ...
- Unit04: 实战技巧 、 登录
Unit04: 实战技巧 . 登录 使用注解方式简化Unit04的小程序. 1. 基于注解的springmvc应用程序的开发 (1)编程步骤 step1. 导包. step2. 添加spring配置文 ...
随机推荐
- Linux-磁盘及网络IO工作方式解析
PIO与DMA 有必要简单地说说慢速I/O设备和内存之间的数据传输方式. PIO我们拿磁盘来说,很早以前,磁盘和内存之间的数据传输是需要CPU控制的,也就是说如果我们读取磁盘文件到内存中,数据要经过C ...
- 推荐的Android ORM框架
1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM.支持JDBC连接,Spring以及Android平台.语法中广泛使用了注解(Annotation ...
- ivy 配置 maven代理
Ivy 是一个依赖管理工具,直观感受是其跟maven 的作用差不多:但这两个其实是不同的工具: maven 是面向整个项目的工程管理及构建工具:ivy 仅作为依赖管理工具,与ant 高度集成. 需要了 ...
- 如何使用vmware-vdiskmanager增加磁盘空间
VMware Virtual Disk Manager Usage: vmware-vdiskmanager.exe OPTIONS <disk-name> | <mount-poi ...
- Linux下使用ping快速检测存活主机
该shell脚本主要是通过ping来批量检测网段内存活主机,执行结果保存在脚本当前目录下的IPinfor目录中,写的比较匆忙,希望大家留下更好的建议. #!/usr/bin/env bash##### ...
- git常用命令 (阿里云code)
命令行指令 Git 全局设置 git config --global user.name "马会东" git config --global user.email "ma ...
- Discrete.Differential.Geometry-An.Applied.Introduction(sig2008)笔记
-------------------------------------------------------------- Chapter 1: Introduction to Discrete D ...
- Hibernate5.2关联关系之双向一对多(三)
Hibernate之双向一对多(三) 一.简介 本篇博文接着上一章的内容接着开展,代码也是 ...
- 64位Windows2008下插入Oracle中文乱码问题解决
最近迁移一个.net应用系统从32位Windows2003升级到64位的Windows2008中,发现所有涉及中文的内容插入到Oracle数据库中都变为?,最开始以为是2008系统的字符集与Oracl ...
- 无法进入adb shell,提示unknown host service的解决办法
今天monkey的简易环境配置好后,准备开始monkey的压测工作,可是在命令控制窗口中输入无法进入adb shell,提示了错误 "unknown host service"