[QDB] 幽靈分享:QDataSet+TQMSSQLConverter 實戰技巧

轉載自QDAC官網網站,文章發現問題可能隨時更新,最新版本請訪問:http://blog.qdac.cc/?p=3066

【注】本文由網友 幽靈 分享,由 swish 整理並從新編輯。
一、將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的方法來轉換數據,速度要比原始方法快了好幾倍。

二、只複製指定列的內容到數據庫
A表有50多個列,但本身只須要導入5個列到數據庫中 ,QDB只須要將上面 1 中的

vQDataSet.CopyFrom(AdoQueryM);
改成:

vQDataSet.CopyFrom(adoquery1,’序號,編碼,名稱,狀態,部門’);
既可。

三、大數據導入技巧-分頁批量導入
【應用場景】

某表有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;
四、本地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 多語言組件快速讓你的程序走向海外 算法

相關文章
相關標籤/搜索