数据库内容复制问题? (50分)

  • 主题发起人 主题发起人 redwood
  • 开始时间 开始时间
R

redwood

Unregistered / Unconfirmed
GUEST, unregistred user!
现有两张表 from,to
from比to表至少少了一个“序号”字段,且该字段为不可重复字段(也就是paradox中带key的字段)。
现在使用BatchMove1.Execute;命令将from的内容转移到to,但是在BatchMove1的mappings中没有设置“序号”的时候(怎么可能有相等项)
程序只能转移第一行就停止了,
需要怎么做才能将全部的内容转移过去呀?

或者有没有更好的办法?注意:两表字段名不完全相同(名称、数量可能不同)
 
insert into to (除了id,all fields ) select * from from
id 是否为自增,如果不是那需要自己增加
 
我知道这样的方法,但是现在是字段名不明确,from字段数不明确怎么写呀?
 
先用我下面的函数得到字段名,再决定怎么写,大致如下:
sqlString:='Insert into to (';
with 源表数据集 do
begin
for i:=0 to fieldcount-1 do
begin
SqlString:=SqlString+F_GetField(源表数据集控件,i);
if i<fieldcount-1 then SqlString:=SqlString+',' else SqlString:=SqlString+')';
end;
end;
sqlString:=SqlString+' select * from from';

用到的函数如下(如有不解之处,请自行查看datatype或fieldtype的帮助):
Function F_GetField(B_DataSet:TDataSet;B_Zdh:integer;B_Mz:integer=0):String;
//Function F_GetField(B_DataSet:TAdoDataSet;B_Zdh:integer;B_Mz:integer=0):String;
//根据给出的字段号返回该字段的Sql字串,数据表为Set_Ora,字段号从0开始计.B_Mz为0时返回字段名,1时返回字段值
begin
With B_DataSet do
if B_Mz=0 then Result:=fields[B_Zdh].FieldName
else
begin
if (Fields[B_Zdh].DataType =ftWideString) or (Fields[B_zdh].DataType =ftString) then
begin
Result:=iif(fields[B_Zdh].asstring='','null',''''+Fields[B_Zdh].asstring+'''');
exit;
end;
if Fields[B_Zdh].DataType = ftFloat then
begin
Result:=iif(fields[B_Zdh].asstring='','null',floatToStrF(Fields[B_Zdh].AsFloat,ffFixed,11,2));
exit;
end;
if (Fields[B_Zdh].DataType = FtSmallInt) or (Fields[B_Zdh].DataType =ftInteger)
or (Fields[B_Zdh].DataType=FtBCD) then
begin
Result:=iif(fields[B_Zdh].asstring='','null',fields[B_Zdh].AsString);
exit;
end;
if Fields[B_Zdh].DataType=ftDate then
begin
Result:=iif(Fields[B_Zdh].asstring='','null','#'+formatDateTime('yyyy-mm-dd',fields[B_Zdh].asDateTime)+'#');
exit;
end;
Result:=''; //尚需增加布尔等类型的判断.
end;
end;
 
没看懂……
 
其实如果只要返回字段名的话,那个函数可以这样简化,你就容易看懂了。
Function F_GetField(B_DataSet:TDataSet;B_Zdh:integer):String;
//根据给出的字段号返回该字段的字段名,数据表为Set_Ora,字段号从0开始计
begin
Result:=B_DataSet.fields[B_Zdh].FieldName
end;

至于前面的一段for循环则是为了得出整个的SQL字符串,如ugvanxk的那一句:
insert into to (除了id,all fields ) select * from from
 
返回字段名有现成函数的FieldList
我自己是使用人工配对的方式进行mapping里的相等值配对,如果我给to表里的序号添加了同类型的字段配给
那么一切正常,我现在需要解决的是在没有配给序号的情况下,只能复制一行纪录的问题

而且由于不知道两表同内容字段的字段名是否相同(并且顺序也不知道是否相同),目前只有使用人工配对的BatchMove1方式
所以insert 不能用……
 
多人接受答案了。
 
后退
顶部