转载自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. oracle单机改变归档路径

    oracle 归档日志文件路径设置 1.  查看LOG_ARCHIVE_DEST 与 ( LOG_ARCHIVE_DEST_n 或 DB_RECOVERY_FILE_DEST )参数情况注意(  LO ...

  2. k8s DNS 服务发现的一个坑

    按照官当文档,以及大家的实践进行k8s dns 服务发现搭建还是比较简单的,但是会有一个因为系统默认dns 配置造成的一个问题 1. linux  默认dns 配置在 /etc/resolv.conf ...

  3. LeetCode---String

    Count and Say 思路:递归求出n - 1时的字符串,然后双指针算出每个字符的次数,拼接在结果后面 public String countAndSay(int n) { if(n == 1) ...

  4. Android Studio--学习系列(2)

    1.Failed to load the LayoutLib: com/android/layoutlib/bridge/Bridge : Unsupported major.minor versio ...

  5. 本地搭建ubuntu

    1 使用VMware Workstation 安装ubuntu 14 2 进入ubuntu 命令行 ctrl+alt+f2 3 默认root用户是无固定密码的,并且是被锁定的,如果想给root设置一个 ...

  6. eclipse简单使用

    1.10个快捷键: 1. ctrl+shift+r:打开资源       Control-Shift-T: 打开类型(Open type) Control-Shift-F: CodeàJavaàPre ...

  7. C#:比较二个字符串,查找出相同字数和差异字符

            ;; i < n; i++)             {                 ) == s2.Substring(i, ))                 /*同位 ...

  8. MSSQL 批量Update

    UPDATE dbo.WX_TWODIMENCODE_INFO SET wti_scan_views=t.count FROM ( SELECT COUNT(*) AS 'count',lci_ere ...

  9. matlab 车牌分割的算法

    function Touying(g) f=rgb2gray(g); % [m n]=size(f); [row col]=size(f); % T=graythresh(f) % T=T*255 % ...

  10. ses_cations 值顺序

    16个位置的字符所代表的操作依次如下: 1. ALTER 2. AUDIT 3.COMMENT 4.DELETE 5.GRANT 6.INDEX 7.INSERT 8.LOCK 9.RENAME 10 ...