主题:VFP表记录导入到MDB数据库如何达到速度最快?
想将VFP中的一个表导入到MDB数据库中,必须要用SQLEXEC()函数来完成:
cTime001="T"+SYS(2015)
USE "D:\我的记录.DBF" ALIAS (cTime001)&&有近35000条共14字段,没有备注类型字段.
?sqlexec(nCon,"insert into 记录表 (字段....) SELECT 字段... FROM ?cTime001")
&&VFP表中的字段与MDB表中的字段是一一对应的
问题就是能否在SQLEXEC中使用VFP表的别名作为数据源?
我上面的方式有错,无法完成数据插入.请各位高手指点一下,如果用远程视图方式一条一条导入到临时表(即远程视图)中再TABLEUPDATE()更新,我测试了一下要用2分钟左右,我认为太慢了,所以看有没有办法一次性SQLEXEC()插入整个表的数据到MDB数据库中.
远程视图用TABLEUPDATE()更新用时:160秒
下面代码用时:133秒
我用SQLEXEC()直接完成导入比远程视图用TABLEUPDATE()更新要快点.代码如下:
SET TALK OFF
ON ERROR RETURN .f.
cSYS_MDBFile=GETFILE("mdb")&&已经有"记录表"的MDB文件
nSb=SQLSTRINGCONNECT("Driver={Microsoft Access-Treiber (*.mdb)};dbq=&cSYS_MDBFile.;uId=admin;pwd=123456")
cTB="记录表"
USE ? ALIAS cSB
GOTO TOP IN "CSB"
nRCT=RECCOUNT("CSB")
nNR=1
WAIT "数据更新中..." WINDOW NOWAIT AT SROW()/2,(SCOLS()-len("数据更新中..."))/2
nTim=SECONDS()
DO WHILE !EOF("CSB")
DT1=编号
DT2=节号
DT3=子号
DT4=年度
DT5=ALLTRIM(保管)
DT6=ALLTRIM(分类)
DT7=ALLTRIM(字号)
DT8=ALLTRIM(名称)
DT9=ALLTRIM(说明)
DT10=IIF(EMPTY(起始时间),NULL,起始时间)
DT11=IIF(EMPTY(终止时间),NULL,终止时间)
DT12=份数
DT13=页数
DT14=ALLTRIM(备注)
IF SQLEXEC(NSB,"INSERT INTO ?cTB (编号,节号,子号,年度,保管,分类,字,名称,说明),起始时间,终止时间,份数,页数,备注)"+;
"VALUES (?DT1,?DT2,?DT3,?DT4,?DT5,?DT6,?DT7,?DT8,?DT9,?DT10,?DT11,?DT12,?DT13,?DT14)")=1
*WAIT "数据更新中..."+ALLTRIM(PADL(RECNO("CSB")*100/nRCT,20))+"%" WINDOW NOWAIT AT SROW()/2,(SCOLS()-len("数据更新中...")+4)/2
SKIP 1 IN "CSB"
ELSE
EXIT
ENDIF
ENDDO
nTim=SECONDS()-nTim
WAIT CLEAR
MESSAGEBOX(ALLTRIM(PADL(nTim,10))+"秒!",64,"耗时")
SET TALK On
cTime001="T"+SYS(2015)
USE "D:\我的记录.DBF" ALIAS (cTime001)&&有近35000条共14字段,没有备注类型字段.
?sqlexec(nCon,"insert into 记录表 (字段....) SELECT 字段... FROM ?cTime001")
&&VFP表中的字段与MDB表中的字段是一一对应的
问题就是能否在SQLEXEC中使用VFP表的别名作为数据源?
我上面的方式有错,无法完成数据插入.请各位高手指点一下,如果用远程视图方式一条一条导入到临时表(即远程视图)中再TABLEUPDATE()更新,我测试了一下要用2分钟左右,我认为太慢了,所以看有没有办法一次性SQLEXEC()插入整个表的数据到MDB数据库中.
远程视图用TABLEUPDATE()更新用时:160秒
下面代码用时:133秒
我用SQLEXEC()直接完成导入比远程视图用TABLEUPDATE()更新要快点.代码如下:
SET TALK OFF
ON ERROR RETURN .f.
cSYS_MDBFile=GETFILE("mdb")&&已经有"记录表"的MDB文件
nSb=SQLSTRINGCONNECT("Driver={Microsoft Access-Treiber (*.mdb)};dbq=&cSYS_MDBFile.;uId=admin;pwd=123456")
cTB="记录表"
USE ? ALIAS cSB
GOTO TOP IN "CSB"
nRCT=RECCOUNT("CSB")
nNR=1
WAIT "数据更新中..." WINDOW NOWAIT AT SROW()/2,(SCOLS()-len("数据更新中..."))/2
nTim=SECONDS()
DO WHILE !EOF("CSB")
DT1=编号
DT2=节号
DT3=子号
DT4=年度
DT5=ALLTRIM(保管)
DT6=ALLTRIM(分类)
DT7=ALLTRIM(字号)
DT8=ALLTRIM(名称)
DT9=ALLTRIM(说明)
DT10=IIF(EMPTY(起始时间),NULL,起始时间)
DT11=IIF(EMPTY(终止时间),NULL,终止时间)
DT12=份数
DT13=页数
DT14=ALLTRIM(备注)
IF SQLEXEC(NSB,"INSERT INTO ?cTB (编号,节号,子号,年度,保管,分类,字,名称,说明),起始时间,终止时间,份数,页数,备注)"+;
"VALUES (?DT1,?DT2,?DT3,?DT4,?DT5,?DT6,?DT7,?DT8,?DT9,?DT10,?DT11,?DT12,?DT13,?DT14)")=1
*WAIT "数据更新中..."+ALLTRIM(PADL(RECNO("CSB")*100/nRCT,20))+"%" WINDOW NOWAIT AT SROW()/2,(SCOLS()-len("数据更新中...")+4)/2
SKIP 1 IN "CSB"
ELSE
EXIT
ENDIF
ENDDO
nTim=SECONDS()-nTim
WAIT CLEAR
MESSAGEBOX(ALLTRIM(PADL(nTim,10))+"秒!",64,"耗时")
SET TALK On