[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配置文 ...
随机推荐
- oracle单机改变归档路径
oracle 归档日志文件路径设置 1. 查看LOG_ARCHIVE_DEST 与 ( LOG_ARCHIVE_DEST_n 或 DB_RECOVERY_FILE_DEST )参数情况注意( LO ...
- k8s DNS 服务发现的一个坑
按照官当文档,以及大家的实践进行k8s dns 服务发现搭建还是比较简单的,但是会有一个因为系统默认dns 配置造成的一个问题 1. linux 默认dns 配置在 /etc/resolv.conf ...
- LeetCode---String
Count and Say 思路:递归求出n - 1时的字符串,然后双指针算出每个字符的次数,拼接在结果后面 public String countAndSay(int n) { if(n == 1) ...
- Android Studio--学习系列(2)
1.Failed to load the LayoutLib: com/android/layoutlib/bridge/Bridge : Unsupported major.minor versio ...
- 本地搭建ubuntu
1 使用VMware Workstation 安装ubuntu 14 2 进入ubuntu 命令行 ctrl+alt+f2 3 默认root用户是无固定密码的,并且是被锁定的,如果想给root设置一个 ...
- eclipse简单使用
1.10个快捷键: 1. ctrl+shift+r:打开资源 Control-Shift-T: 打开类型(Open type) Control-Shift-F: CodeàJavaàPre ...
- C#:比较二个字符串,查找出相同字数和差异字符
;; i < n; i++) { ) == s2.Substring(i, )) /*同位 ...
- MSSQL 批量Update
UPDATE dbo.WX_TWODIMENCODE_INFO SET wti_scan_views=t.count FROM ( SELECT COUNT(*) AS 'count',lci_ere ...
- matlab 车牌分割的算法
function Touying(g) f=rgb2gray(g); % [m n]=size(f); [row col]=size(f); % T=graythresh(f) % T=T*255 % ...
- ses_cations 值顺序
16个位置的字符所代表的操作依次如下: 1. ALTER 2. AUDIT 3.COMMENT 4.DELETE 5.GRANT 6.INDEX 7.INSERT 8.LOCK 9.RENAME 10 ...