最近在做项目时用到dbf数据库,需要将dbf数据库的结构及内容一起导入到sql2005中。网上找了N多资料发现都是千篇一律copy别人的,问题一大堆。这里总结了一下,安装网上的方法在sql2000中大多数都是可行的,但是在sql2005中就出问题了。
这里我将具体描述一下dbf 导入 sql2005的操作步骤(access、excel我没试过,解决问题的原理应该一样)!!如果感觉麻烦也可以使用我自己开发的dll直接访问dbf并导出sql语句:
项目中的问题:用户选择N个dbf文件导入sql2005数据库,由于每年dbf表结构都在变化,所以在sql2005中根本就不存在,需要每年根据dbf的结构自动建表。
解决方法(摘抄自网络):
--方法一:
select * into 要生成的SQL表名 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV;HDR=NO;IMEX=2;DATABASE=c:/','select * from dbf表名.dbf')
--方法二:
select * into 要生成的SQL表名 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase III;HDR=NO;IMEX=2;DATABASE=c:/','select * from dbf表名.dbf')
--方法三:
select * into 要生成的SQL表名 from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:/','select * from dbf表名.DBF')
--用前两种方法导入SQL SERVER后,源表再用VFP打开就不提示“不能存取文件”,说明语句执行后就把源表关闭了。不过也有不尽人意的地方,就是用前两种方法导入后,源表中的字符型字段导入后SQL表字段对应变成NVARCHAR了。
--第三种方法有一个缺点:把DBF表导入SQL Server中后,马上用VISUAL FOXPRO打开DBF表,会提示“不能存取文件”,即这个表还被SQL打开着呢。可是过了1分钟左右,再打开DBF表就可以了,说明经过一段时间后查询分析器才把这个表关闭。
我使用第三种方法,实际操作中可能出现的问题:
正确、完整的sql写法
1.无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "msdasql" 的数据源对象”;
EXEC sp_configure 'show advanced options',1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ad Hoc Distributed Queries',1;
GO
RECONFIGURE;
GO select * Into dbftosql From openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=C:/','select * from cxcls.dbf')
EXEC sp_configure 'Ad Hoc Distributed Queries',0;
GO
RECONFIGURE;
GO
EXEC sp_configure 'show advanced options',0;
GO
RECONFIGURE;
GO
原因是安装sql2005数据库的系统中没有 VFPODBC驱动,到http://msdn.microsoft.com/en-us/vfoxpro/bb190233.aspx下载并安装
2.SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问;
原因是因为“功能的外围应用配置器”中没有“启用openrowset和opendatasource支持”,只需要打开“功能的外围应用配置器”设置一下就可以。当然也可以用sql语句操作:
EXEC sp_configure 'show advanced options',1;
GO;
RECONFIGURE;
GO;
EXEC sp_configure 'Ad Hoc Distributed Queries',1;
GO;
RECONFIGURE;
GO
建议操作完成后在关闭这个功能,否则会有安全隐患!关闭的方法和打开相反先
EXEC sp_configure 'Ad Hoc Distributed Queries',0;
GO;
RECONFIGURE;
GO;
EXEC sp_configure 'show advanced options',0;
GO;
RECONFIGURE;
GO
3.返回了消息 "[Microsoft][ODBC Visual FoxPro Driver]File 'XXXX.dbf' does not exist;
原因是因为XXXX.dbf文件找不存在或路径不正确,xxxx文件必须是在sql2005服务器而不是你本机(如果数据库不是按装在你本机)。
4.返回了消息 "[Microsoft][ODBC Visual FoxPro Driver]Memo file c:/XXX.fpt is missing or is invalid.
原因是因为dbf中含有 memo类型的字段,但是导入时在同一个目录中没有找到存储memo的fpt文件(拷贝dbf文件时千万别忘记fpt文件)!
其他问题暂时还没遇到,如果文章中有什么笔误 或 其他同行有什么补充,请留言!