转载自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 实战技巧的更多相关文章

  1. Unity User Group 北京站图文报道:《Unity虚拟现实实战技巧》

    时间来到了盛夏,北京UUG活动也来到了第八期.本次活动的主题为<Unity虚拟现实实战技巧>,为此我们邀请了4位资深的行业大神.这次我们仍然在北京市海淀区丹棱街5号微软大厦举行活动,在这里 ...

  2. C#并行Parallel编程模型实战技巧手册

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  3. Android实战技巧:深入解析AsyncTask

    AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...

  4. webpack快速入门——实战技巧:watch的正确使用方法,webpack自动打包

    随着项目大了,后端与前端联调,我们不需要每一次都去打包,这样特别麻烦,我们希望的场景是,每次按保存键,webpack自动为我们打包,这个工具就是watch! 因为watch是webpack自带的插件, ...

  5. webpack快速入门——实战技巧:开发和生产并行设置

    package.json中,devDependencies和dependencies是不同的 devDependencies:开发依赖 dependencies:生产依赖(线上) 1.安装生产环境的依 ...

  6. webpack快速入门——实战技巧:webpack模块化配置

    首先在根目录,新建一个webpack_config文件夹,然后新建entry_webpack.js文件,代码如下: const entry ={}; //声明entry变量 entry.path={ ...

  7. webpack快速入门——实战技巧:优雅打包第三方类库

    下面说两种方法: 一. 1.引入jQuery,首先安装: cnpm install --save jquery 2.安装好后,在我们的entry.js中引入: import $ from 'jquer ...

  8. webpack快速入门——实战技巧:webpack优化黑技能

    1.抽离jquery,vue(多个第三方类库抽离) 修改入口文件(webpack.config.js中) entry: { entry: './src/entry.js', jquery:'jquer ...

  9. Unit04: 实战技巧 、 登录

    Unit04: 实战技巧 . 登录 使用注解方式简化Unit04的小程序. 1. 基于注解的springmvc应用程序的开发 (1)编程步骤 step1. 导包. step2. 添加spring配置文 ...

随机推荐

  1. 路由 - ASP.NET MVC 4 系列

           软件开发人员常常对一些细小的细节问题倍加关注,由其在考虑源代码的质量和结构时更是如此.因此,当遇到大部分使用 ASP.NET 技术构建的站点,使用如下的 URL 地址时,可能会有些奇怪: ...

  2. Entity Framework 摘记

    1.设置隔离级别 var transactionOptions = new System.Transactions.TransactionOptions(); transactionOptions.I ...

  3. asp.net gridview 鼠标悬浮提示信息

    使用场景: gridview绑定数据,某列数据太多,故超过一定字符,隐藏起来,同时鼠标移到指定列显示其明细信息: 知识点: 1,oderListTbl_DataBound事件中,添加,oderList ...

  4. SQL2005语句实现行转列,列转行

    在做报表时,经常需要将数据表中的行转列,或者列转行,如果不知道方法,你会觉得通过SQL语句来实现非常难.这里,我将使用pivot和unpivot来实现看似复杂的功能.这个功能在sql2005及以上版本 ...

  5. vc++>>Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enable

    用VC来连接远程MYSQL时,出现如标题一样的错误,网上搜索了此错误产生的原因,最后自己找到了解决办法. 此错误产生的原因: 异常原因在于服务器端的密码管理协议陈旧,使用的是旧有的用户密码格式存储:但 ...

  6. python(28)获得网卡的IP地址

    获得第几块网卡的ip地址: def get_ip_address(self,ifname): # ifname = 'eth0' s = socket.socket(socket.AF_INET, s ...

  7. dubbo-admin和dubbo-monitor-simple的布署

    dubbo-admin 把dubbo-admin的war包解压到tomcat或者jetty的ROOT目录下,启动就可以访问了(自己配置tomcat的端口) wget http://code.aliba ...

  8. libZPlay 音频编码解码器库

    libZPlay 音频编码解码器库 http://www.oschina.net/p/libzplay libZPlay 播放音乐并显示 FFT 图形 :http://www.oschina.net/ ...

  9. EJB初识(通熟易懂)

    转载自http://blog.csdn.net/jojo52013145/article/details/5783677,讲的很透彻,佩服,膜拜学习 1. 我们不禁要问,什么是"服务集群&q ...

  10. linux基础学习

    1.默认不写端口号的就是80端口 本地ip:localhost或者127.0.0.1 2.用户管理 id和whoami:可以查看当前用户 who和w查看当前已经登录的用户 (1)添加用户,用户默认的家 ...