B
babysheep
Unregistered / Unconfirmed
GUEST, unregistred user!
忍受不了了,我在做一个从foxpro转数据到sqlserver的工作,当数据量超过一定量的时候,程序会出错,
我不知道是什么地方出错了,不知道是程序错误还是数据库端的错误,还是解析的错误,尝试了很多种方法,
仍未能解决,如果有哪位大侠做过这方面工作的,可以提点建议。
尝试过的测试:有个表有15000条记录,20个字段,转录了5200条
另一个表有1900条记录,115个字段,转录了400条
都是到一定的地方就会出错。实在搞不懂为什么。请各位帮忙,很急很急。
procedure TForm1.CommonTrans(Tablecode,WhereStr:string;SourceQuery,DesQuery,DesQuery2:TQuery);
var
sSql,sSqltmp,valuefield:string;
CommonVar:array[0..250,0..2] of string;//第二维数组前两位记录的是字段名和类型
KeyWordVar:array of string;
//---totalcount是被转录表的记录数,nowcount现在的记录数,nowtimes当前记录数,当达到100后重新计数
i,j,k,lenb,totalcount,nowcount,nowtimes:integer;
li1,li2:TListItem;
begin
sSql:='delete from '+Tablecode;
if not ExecuteSql(sSql,DesQuery) then exit;
sSqltmp:='';
//---从目标库字典表中查找字段名和字段类型,存放在数组中
sSql:='select FIELDCODE,FIELDTYPE from HF_FIELDDICT_MAIN '+
'where TABLECODE='''+Tablecode+'''';
if not ExecuteSql(sSql,DesQuery) then exit;
i:=0;
with DesQuery do
begin
while not eof do
begin
CommonVar[0]:=Fields[0].asstring;
CommonVar[1]:=Fields[1].asstring;
i:=i+1;
next;
end;//end while
end;//end with
//---从源库中查找表记录,然后把结果存入上述数组中
sSql:='select count(*) from '+Tablecode+' '+WhereStr;
if not ExecuteSql(sSql,SourceQuery) then exit;
totalcount:=SourceQuery.fields[0].asinteger;
nowcount:=1;
nowtimes:=1;
sSql:='select * from '+Tablecode+' '+WhereStr;
if not ExecuteSql(sSql,SourceQuery) then exit;
with SourceQuery do
begin
k:=0;
while not eof do
begin
valuefield:='';
for j:=0 to i-1 do
begin
CommonVar[j][2]:=TransChar(Fields[j].asstring,'''','"');//替换单引号
if CommonVar[j][2]='True' then
CommonVar[j][2]:='1'
else if CommonVar[j][2]='False' then
CommonVar[j][2]:='0';
//---组织插入sql语句
if (CommonVar[j][1]='N') or (CommonVar[j][1]='F') then
valuefield:=valuefield+CommonVar[j][2]
else
valuefield:=valuefield+''''+CommonVar[j][2]+'''';
valuefield:=valuefield+',';
application.ProcessMessages;
end;//end for
//---除去最后的逗号
lenb:=length(valuefield);
valuefield:=copy(valuefield,1,lenb-1);
sSqltmp:=sSqltmp+'insert into '+Tablecode+
' values('+valuefield+') ';
//---如果记录数达到100条或者到达最后一条后,则执行一次
if (nowtimes=100) or (nowcount=totalcount) then
begin
if not ExecuteSql(sSqltmp,DesQuery2) then exit;
sSqltmp:='';
nowtimes:=0;
end;//end if
next;
nowtimes:=nowtimes+1;
nowcount:=nowcount+1;
end;//end while
end;//end with
end;
我不知道是什么地方出错了,不知道是程序错误还是数据库端的错误,还是解析的错误,尝试了很多种方法,
仍未能解决,如果有哪位大侠做过这方面工作的,可以提点建议。
尝试过的测试:有个表有15000条记录,20个字段,转录了5200条
另一个表有1900条记录,115个字段,转录了400条
都是到一定的地方就会出错。实在搞不懂为什么。请各位帮忙,很急很急。
procedure TForm1.CommonTrans(Tablecode,WhereStr:string;SourceQuery,DesQuery,DesQuery2:TQuery);
var
sSql,sSqltmp,valuefield:string;
CommonVar:array[0..250,0..2] of string;//第二维数组前两位记录的是字段名和类型
KeyWordVar:array of string;
//---totalcount是被转录表的记录数,nowcount现在的记录数,nowtimes当前记录数,当达到100后重新计数
i,j,k,lenb,totalcount,nowcount,nowtimes:integer;
li1,li2:TListItem;
begin
sSql:='delete from '+Tablecode;
if not ExecuteSql(sSql,DesQuery) then exit;
sSqltmp:='';
//---从目标库字典表中查找字段名和字段类型,存放在数组中
sSql:='select FIELDCODE,FIELDTYPE from HF_FIELDDICT_MAIN '+
'where TABLECODE='''+Tablecode+'''';
if not ExecuteSql(sSql,DesQuery) then exit;
i:=0;
with DesQuery do
begin
while not eof do
begin
CommonVar[0]:=Fields[0].asstring;
CommonVar[1]:=Fields[1].asstring;
i:=i+1;
next;
end;//end while
end;//end with
//---从源库中查找表记录,然后把结果存入上述数组中
sSql:='select count(*) from '+Tablecode+' '+WhereStr;
if not ExecuteSql(sSql,SourceQuery) then exit;
totalcount:=SourceQuery.fields[0].asinteger;
nowcount:=1;
nowtimes:=1;
sSql:='select * from '+Tablecode+' '+WhereStr;
if not ExecuteSql(sSql,SourceQuery) then exit;
with SourceQuery do
begin
k:=0;
while not eof do
begin
valuefield:='';
for j:=0 to i-1 do
begin
CommonVar[j][2]:=TransChar(Fields[j].asstring,'''','"');//替换单引号
if CommonVar[j][2]='True' then
CommonVar[j][2]:='1'
else if CommonVar[j][2]='False' then
CommonVar[j][2]:='0';
//---组织插入sql语句
if (CommonVar[j][1]='N') or (CommonVar[j][1]='F') then
valuefield:=valuefield+CommonVar[j][2]
else
valuefield:=valuefield+''''+CommonVar[j][2]+'''';
valuefield:=valuefield+',';
application.ProcessMessages;
end;//end for
//---除去最后的逗号
lenb:=length(valuefield);
valuefield:=copy(valuefield,1,lenb-1);
sSqltmp:=sSqltmp+'insert into '+Tablecode+
' values('+valuefield+') ';
//---如果记录数达到100条或者到达最后一条后,则执行一次
if (nowtimes=100) or (nowcount=totalcount) then
begin
if not ExecuteSql(sSqltmp,DesQuery2) then exit;
sSqltmp:='';
nowtimes:=0;
end;//end if
next;
nowtimes:=nowtimes+1;
nowcount:=nowcount+1;
end;//end while
end;//end with
end;