关于数据转移的问题(100分)

  • 主题发起人 主题发起人 alys
  • 开始时间 开始时间
A

alys

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好,我刚开始学编程,遇到点问题,请大家帮忙。

有两个库Tab1、Tab2,两个库的字段名、字段类型、字段长度均一样,都是 ID、A、B、C、D、E。现遇到的问题如下:
我要将Tab1中的数据转移到Tab2中,要求:
1. 如果Tab1中记录的ID(字段内容)在Tab2中已存在,则将该记录C、E的内容覆盖掉Tab2中相同ID的C、E字段的内容。
2. 如果Tab1中记录的ID在Tab2中还没有,则将该记录的全部字段内容加到Tab2中。
请大家帮忙想一想运行速度较快的代码该怎么写(我有一个笨办法,但速度很慢)?
 
可以用一个TBatchMove控件,把它的Source设为Tab1,Destination设为Tab2,
Mode设为batAppendUpdate;然后调用它的Execute方法。
速度上不敢说,但是程序只有几行代码:)
 
to dq:
好像不只几行那么简单了
你忘记了要考虑主键冲突的处理方法了
 
to 轩辕散光:
你是说Tab1和Tab2会出现主键冲突?
我觉得用batAppendUpdate模式应该没问题的。帮助里的解释是如果主键重复就替换,不重复就添加。
先让alys试一下吧:)
to alys:
用TBatchMove可以提供更多的操作信息和记录下有问题的操作记录;具体的查一下帮助。
其实单纯实现数据传递最简单的办法是Tab2.BatchMove(Tab1, batAppendUpate);一句就行了。
 
谢谢 dq、轩辕散光,但是如果Tab1中记录的ID(字段内容)在Tab2中已存在,我只要将该记录C、E两字段的内容覆盖掉Tab2中相同ID的C、E字段的内容,而并不是全部覆盖啊。有什么解决办法吗?
 
to alys:
哦,不好意思,没看清题目要求:)
这样的话就必须用TBatchMove控件,需要设置它的Mappings属性;
分两步走,第一步修改,第二步添加;还要用到一个TQuery控件——

procedure TForm1.Button1Click(Sender: TObject);
begin
with BatchMove1 do begin
Destination := Table2;
Source := Table1;
Mode := batUpdate;//修改
with Mappings do begin//设置字段映射关系
Clear;
Add('id=id');
Add('b=b');
Add('e=e');
end;
Execute;
//这样的话如果id重复,则只修改Tab2里的c、e字段;
Query1.Close;
Query1.Sql.Text := 'select * from tab1 where id not in (select id from tab2)';
//用SQL取出ID不重复的记录
Source := Query1;
Mode := batAppend;//添加
Mappings.Clear;//清除映射,全部添加
Execute;
end;
end;

再试试。
 
to dq:
我直接用 Mode:=batAppendUpdate; 可否?我看了一下 help 发现它似乎能达到我的要求,
记录不重复的话能自己加到 destination table 里。
另外,程序一运行到 Execute 就停止了,我看了一下数据库,什么也没变,why?
盼复。
 
to alys:
直接用batAppendUpdate不行的,那样如果重复的话会把其它字段一并修改的(不设Mappings),
如果同时指定了Mappings,那么新添加的记录中不在Mappings指定的字段值都为空的。

“停止了”是什么意思?没执行?报错?你是用的我在上面写的代码吗?哪一句Execute停的?
我试过,可以的。另外更正一下,上面的Add('b=b');这一句写错了,应该是Add('c=c');
你再根据你的实际情况好好检查一下代码有没有问题。
 
to dq:
ok,程序是运行了,不过又发现了问题,程序运行时没报什么错,但数据库却没改过,和运行前一样。还有哪些地方要注意?
我只对目标数据库中存在的字段进行修改,还没试添加。 :(
代码如下:
with BatchMoveIn do
begin
source:=tblIn;
destination:=tblEsis ;
Mode:=batUpdate;
with Mappings do
begin
Clear;
Add('A01=A01');
Add('A03=A03');
end;
Execute;
end;

好象没错啊?
 
主键加进Mappings里了吗?即A01或A03是主键吗?
不对主键进行映射是不行的,即一定要有Add('id=id');
 
to dq:
A01是关键字
 
A01确实是物理关键字?
如果是,单从你给出的代码我看不出有什么问题,你可以把源程序和相关表结构发一份给我。
如果不是,要么把A01设成物理关键字,要么就再听听别人的意见吧:)
 
多人接受答案了。
 

Similar threads

回复
0
查看
978
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部