摘要:本文主要介绍用SQLServerbcp、Foxpro编程、Access等方法将.dbf数据库转换到SQLServer表的方法。
关键词:XbaseDBFSQLServer数据库转换
1、前言
当今,数据库联网实现数据共享已经成为信息系统建设中一个迅速发展的潮流。利用SQLServer、Oracal、Sybase等客户机/服务器(Client/Server)体系结构的数据库系统进行信息系统的开发、更新改造已成为当前一大趋势。而Dbase、Foxbase、Foxpro是我国近年应用较为广泛的数据库开发软件,许多单位、部门多年来积累了大量的宝贵的数据资料,这些部门在进行计算机信息系统改造、更新的同时,面临如何继承大量历史数据的问题,本文介绍三种将DBF数据转换成SQLServer表的方法。
2、利用SQLServer所提供的块拷贝实用程序(bcp)转换
实用程序bcp.exe可从服务器SQL目录下的BINN子目录下获得。
2.1、bcp的命令格式及主要参数
bcp[[database_name.]owner.]table_name{in|out}datafile[/mmaxerror][/fformatfile][/eerrfile][/n][/c][/t]field_term][/rrow_term][/Ulogin_ID][/Ppassword][/Sservername][/vversion][/apacket_size]
主要参数:
database_name数据库名
in|outin从文件到数据库表的拷贝。
out从数据库表到文件拷贝。
datafile操作系统文件的路径。该路径的长度可以是
1-255个字符。也可指明磁盘驱动器名字。
/C用字符类型作为缺省值执行拷贝操作。
/ulogin_ID指定登录标识符。
/Ppassword允许指定一个口令。
/Sservername允许用户指定连接到哪个SQLServer
2.2、实现转换的具体方法
我们以Foxpro的数据库结构的单位职工库(zg.dbf)为例,进行数据转换。其数据结构为:
字段名类型字段长度小数点位数字段内容
bhC4职工编号
xmC8职工姓名
xbC2性别
nlN20年龄
zwC10职务
gzsjD参加工作时间
jlM简历
zpG照片
实现步骤:
(1)、启动服务器,进入WindowNT,SQLServer6.0,打开SQLEnterpriseManager为单位职工库创建一个数据库设备zg.dat,然后在该设备上建立zg数据库及表(Table),表的数据结构要与zg.dbf的数据结构一致。或用以下SQLServer命令创建设备和创建表。
A、创建数据设备
diskinit
name="zg"数据库设备名
physname="c:\\zg\\zg.dat"数据库文件所在路径
vdevno=8数据库设备的标识号
size=5120数据库设备大小(10M)
B、建立zg表
createdatabasezg_dataonzg=1024,logonzg=1024建立数据库
usezg_data
createtablezg(bhchar(4)null,xmchar(8)null,xbchar(2)null,nlintnull,zwchar(10)null,gzsjdatatimenull,jltextnull,zpimagenull)建立表
go
(2)、在客户机上启动Foxpro,用USE命令打开需转换的.dbf文件,用COPY命令将.dbf文件中数据转换成标准的文本文件.txt,命令如下:
usezg.dbf
copyalltozg.txtdeliwithblan
(3)、从客户机登录到WindowsNT服务器上,将zg.txt文件拷贝到服务器的职工库目录c:\\zg下。
(4)、在服务器上,由WindowsNT进入到MS-DOS状态,然后执行bcp将数据从zg.txt转换到SQL表,命令格式如下:
bcpzginzg.txt/c/smainserver/umanager/P0001(mainserver为服务器名,manager为用户名,0001为用户口令)。
该转换方法速度较快,不占用服务器上事务日志空间。但较为复杂、繁锁,操作者必须熟练掌握Foxpro、SQLServer的命令和操作,而且无法将Foxpro的Memo、General字段转换到SQLServer表。
3、用FoxproforWindow2.5编程实现转换
"用Foxpro编程实现数据转换"即通过SQLServer提供的ODBC接口(开放数据库接口)及Foxpr提供ODBC接口工具ConnectivityKit(fpsql.fll),建立SQL与Foxpro的连接,由Foxpro向SQLServer提交创建表命令,然后将.dbf的每条记录,串成一个字符串,将插入命令连同字符串提交给SQLServer,完成数据转换。
实现步骤:
(1)、ODBC的设置:在客户机上启动Windowsforgroup,进入Windows的控制面板(Controlpanel)。双击ODBC图标,进行zg数据库的ODBC驱动设置。
选择"Add"增加新的ODBC驱动接口,在InstallODBCdrivers项选择"SQLServer",按"OK",弹出"ODBCSQLServerSetup"窗口,在Datasourcename项中输入"zg_data",Server项输入"mainserver",按"OK"完成设置。
(2)、采用上述方法一中步骤1的⑴、⑵创建zg数据库设备及数据库,然后执行Foxpro程序crea_table,创建一个结构与.dbf结构相同的SQLServer表。程序清单如下:
crea_table.prg程序清单
settalkoff
closeall
clearall
clear
store""todbf_name
&&dbf_name待转换的.dbf数据库
store""tosql_db
&&sql_db目的SQL数据库
store""tosql_com
&&sql_com向SQLServer提交的命令
store""tosql_title
&&sql_title为向SQLServer提交命令字头
store0tohandle
&&handle为Foxpro与SQLServer连接的标识
store0tosuccess
&&success为命令提交成功与否的标识
setliptofpsql.fll
@2,20say"请输入要转换的数据库(dbf)名:"getdbf_name
@3,20say"请输入目的SQL数据库名:"getsql_db
read
dbf_name=allt(dbf_name)
sql_db=allt(sql_db)
handle=dbconnect(sql_db,"sa","")
&&建立Foxpro与SQLServer连接
ifhandle>0&&若连接成功则
use&dbf_nameasop_dbfin0
&&以op_dbf为别名打开待转换数据库
seleop_dbf
copytodb_strustruexte
&&将其数据结构拷贝生成db_stru库
usedb_struin0
seledb_stru
gototop
sql_com="creattable"+dbf_name+"("
dowhile.not.eof()
sql_com=sql_com+field_name+""
docase
casefield_type="C"
sql_com=sql_com+"char("+;
allt(str(field_len))+")"
casefield_type="N"
iffield_dec=0
iffield_len<8
sql_com=sql_com+"int"
else
sql_com=aql_com+"float"
endif
else
sql_com=sql_com+"float"
endif
casefield_type="D"
sql_com=sql_com+"datatime"
casefield_type="M"
sql_com=sql_com+"text"
casefield_type="G"
sql_com=sql_com+"binary"
endcase
skip
if.not.eof()
sql_com=sql_com+","
endif
enddo
sql_com=aql_com+")"
success=dbexec(handle,sql_com)
ifsuccess
waitwind"SQLServer表已建立成功!"
else
waitwind"SQLServer表建立失败!"
endif
closeall
clearall
retu
else&&若连接不成功
waitwind"对不起,输入参数错误,无法连接SQLServer"
clearread
retu
endif
(3)、再执行Foxpro程序conv_data将数据由.dbf传输到SQLServer表中。
conv_data.prg程序清单
conv_data.prg程序清单
settalkoff
closeall
clearall
clear
store""todbf_name
&&dbf_name待转换的.dbf数据库
store""tosql_db
&&sql_db目的SQL数据库
store""tosql_com
&&sql_com向SQLServer提交的命令
store""tofname
&&fname字段名
store0tohandle
&&handleFoxpro与SQLServer连接的标识
store0tosuccess
&&success命令提交成功与否的标识
setliptofpsql.fll
@2,20say"请输入要转换的数据库(dbf)名:"getdbf_name
@3,20say"请输入目的SQL数据库名:"getsql_db
read
dbf_name=allt(dbf_name)
sql_db=allt(sql_db)
handle=dbconnect(sql_db,"sa","")
&&建立Foxpro与SQLServer连接
ifhandle>0&&若连接成功则
use&dbf_nameasop_dbfin0
&&以op_dbf为别名打开待转换数据库
seleop_dbf
copytodb_strustruexte
&&将其数据结构拷贝生成db_stru库
usedb_struin0
seledb_stru
gototop
sql_title="insertinto"+dbf_name+"("
dowhile.not.eof()
sql_title=sql_title+field_name
skip
if.not.eof()
sql_title=sql_title+","
else
sql_title=sql_title+")values(""
endif
enddo
seleop_dbf
gototop
dowhile.not.eof()
sql_com=sql_title
seledb_stru
gototop
dowhile.not.eof()
fname=field_name
docase
casefield_type="C"
sql_com=sql_com+&fname
casefield_type="N"
sql_com=sql_com+"convert(int(8),""+str(*fname)+"")"
casefield_type="M"
sql_com=sql_com+"null"
casefield_type="G"
sql_com=sql_com+"null"
endcase
skip
if.not.eof()
sql_com=sql_com+"",""
else
sql_com=aql_com+"")"
endif
enddo
success=dbexec(handle,sql_com)
seleop_dbf
skip
enddo
else&&若连接不成功
waitwind"对不起,输入参数错误,无法连接SQLServer"
clearread
retu
endif
使用上述方法,只要知道一些简单的SQLServer操作及Foxpro编程便可实现将.dbf数据转换到SQLServer。运行程序然后输入待转换的数据库名,及目的数据库名就可实现转换,快捷方便。但不足的是,该方法在原数据库.dbf含有Memo、General字段时,转换就比较困难,目前尚没有找到有效的解决方法。
4、用第三方数据库软件Access进行转换
Access是Microsoft公司的数据库开发软件,使用Access提供的数据输入(Inport)/输出(Export)的功能及ODBC接口,可直接将数据结构及数据转送到SQLServer。
实现步骤:
(1)、按方法二中的第1、2步骤完成数据库设备、数据库创建和ODBC接口的设置。
(2)、然后在WindowsforWorkgroup中启动Access,在File菜单中选择"new"创建一个新的Access数据库,然后在File菜单中选择"Attachtable"连接zg.dbf数据库。
(3)、在"Attach"窗口的"Datasource"栏中选择数据库源为Foxpro2.5,按"OK",之后弹出"SelectMicrosoftAccessDatabase"窗口,在该窗口选择要转换的.dbf数据库zg.dbf,按"OK"结束,然后按"Close"完成数据库连接。
(4)、在File菜单中选择"Export"输出数据,在"Export"窗口选择目标数据库类型"<SQLServer>"按"OK"进入下一窗口"SelectMicrosoftAccessObject",在"ObjectinDB1"栏选择要转换的数据库zg,在窗口的"View"栏下选择"Table"项,,按"OK"。
(5)、进入"Export"窗口,在"Exportzgto"栏目下输入目的数据库名zg,按"OK"。进入"SQLDataSources"窗口,在"SelectDataSource",选择在ODBC中定义好的zg数据源,按"OK"
(6)、进入"SQLServerlogin"窗口,在"LoginID:"栏中输入登录用户名"sa",在"Password"栏中若有登录口令则输入口令。否则按"OK"开始进行数据转换。
使用该方法用户不需要深入了解Foxpro命令及SQLServer命令,也不须深入了解Access操作,更不需对.dbf数据库的数据结构进行分析,Access可根据原.dbf数据库的结构自动在SQLServer上创建一个结构相同的表,并且可将原.dbf数据库中不论是字符型、数字型、日期型、Memo型、General型的所有数据转换到SQLServer表中。该方法可以简单、方便快捷、完整地将所有.dbf中的数据的转换到SQLServer。
但使用该方法要注意一点,若要转换的数据量很大时,SQLServer中分配给该数据库的日志设备要足够大,或可在SQLServer中的ISQL/w命令窗口中用以下命令进行监控,并及时清除。
dbccsqlperf(logspace)检查事务日志空间的使用量
dumptransactionzgwithtruncate_only清除事务日志中已完成任务的数据
5、结束语
以上三种方法运行环境服务器端网络操作系统为WindowNT4.0,网络数据库为SQLServer6.5,客户机Windows95,FoxproforWindow2.6,Access97。
方法二、方法三均通过ODBC数据接口进行数据转换。因此,这两种方法对Oracal、Sybase等数据库也可适用,只要对Windows中的ODBC数据接口设置作些改动,我们也可将.dbf的数据转换到Oracal或Sybase的表中。以此类推,只要数据库提供了ODBC功能,使用上述方法二、方法三均可实现两种数据库之间的数据转换。
作者:范平川、罗春梅