Sql server 2008 将Foxpro表导入SQL Server
我们有800个不同的.dbf文件,需要将它们的文件名作为新表名加载到SQL Server中,因此必须将file1.dbf加载到SQL Server中的表file1中Sql server 2008 将Foxpro表导入SQL Server,sql-server-2008,tsql,visual-foxpro,foxpro,Sql Server 2008,Tsql,Visual Foxpro,Foxpro,我们有800个不同的.dbf文件,需要将它们的文件名作为新表名加载到SQL Server中,因此必须将file1.dbf加载到SQL Server中的表file1中 像这样,我们需要将所有800个Foxpro表加载到sqlserver中。有人对此有想法吗,或者有剧本吗?非常感谢您的帮助。此问题有多种解决方案。一种是使用VFP附带的升迁向导。我只试了原版,一点也不好。从那以后我就没用过。您可以尝试上载一个测试数据库,其中有一个表,比如说有一百万行,只是为了看看使用它是否可行,使用一百万行不会超过一
像这样,我们需要将所有800个Foxpro表加载到sqlserver中。有人对此有想法吗,或者有剧本吗?非常感谢您的帮助。此问题有多种解决方案。一种是使用VFP附带的升迁向导。我只试了原版,一点也不好。从那以后我就没用过。您可以尝试上载一个测试数据库,其中有一个表,比如说有一百万行,只是为了看看使用它是否可行,使用一百万行不会超过一分钟 我所做的是创建一个生成器,该生成器将按照我想要的映射创建SQL server表,即:memo to varchar或varbinary MAX、char to varchar等。然后使用我编写的基于C的activex代码加载表-一次加载多个表其他加载表的方式非常慢。此后,该代码用于创建SQL server表和\或将现有客户的数据传输到SQL server 另一种有效的方法是,使用VFPOLEDB创建一个链接到VFP的服务器,然后使用OpenQuery获取表的结构和数据:
select * into [TableName]
from OpenQuery(vfpserver, 'select * from TableName ...')
这个函数也很快,允许您在查询中使用VFP特定的函数,但是结果字段类型可能不是您喜欢的类型 下面是用FoxPro 9编写的解决方案。您可能需要修改一下,因为我只处理了3种数据类型。您还必须注意SQL保留字作为字段名
可能重复使用ODBC DSN或OLE DBN如果您有可用的Visual FoxPro,请从www.vfpx.org获取最新版本的升迁向导并使用它。请注意,VFP和Sql Server对数值数据类型的精度有不同的定义。例如,如果您的vfp字段是Numeric4,1,并且您在该字段中选择了一个值为100的记录,Sql Server将被打乱。“关于这件事的一个小讨论。”Supersnake,我知道情况,我不明白你为什么给我发这个消息。使用我提出的生成SQL server表并通过C activex进行导入的方法,不会出现这样的问题。OpenQuery也没有这样的问题。你的警告对我没有意义。毕竟,我希望这将是升级到SQL server时唯一需要注意的事情。我的评论是针对找到此页面的未来用户。我们最近在Sql Server Management Studio中使用了OpenQuery语句来获取VFP数据,这就是我们获取错误的原因。@Supersnake,使用OpenQuery,您可以使用VFP特定的函数,正如我前面所说的。你可以用它来防止这个问题。在VFP中使用数字数据类型从来都不是一个好主意。
SET SAFETY OFF
CLOSE ALL
CLEAR ALL
CLEAR
SET DIRE TO "C:\temp"
** house keeping
RUN del *.fxp
RUN del *.CDX
RUN del *.bak
RUN del *.err
RUN del *.txt
oPrgDir = SYS(5)+SYS(2003) && Program Directory
oPath = "C:\temp\pathtodbfs" && location of dbfs
CREATE TABLE dbfstruct (fldno N(7,0), fldnm c(16), fldtype c(20), fldlen N(5,0), fldpoint N(7,0)) && dbf structure table
STORE SQLSTRINGCONNECT("DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=testdbf;UID=root;PWD=root; OPTION=3") TO oConn && SQL connection
SET DIRE TO (m.oPath)
STORE ADIR(aFL, "*.dbf") TO iFL && getting list of dbfs
SET DIRE TO (m.oPrgDir)
FOR i = 1 TO iFL
IF AT("dbfstruct.dbf", LOWER(aFL(i,1))) = 0 THEN
USE oPath + "\" + aFL(i,1)
LIST STRUCTURE TO FILE "struct.txt" && output dbf structure to text file"
SET DIRE TO (m.oPrgDir)
USE dbfstruct
ZAP
APPEND FROM "struct.txt" TYPE SDF
DELETE FROM dbfstruct WHERE fldno = 0 && removing non esential text
PACK
CLEAR
DELETE FILE "struct.txt"
SET DIRE TO (m.oPrgDir)
=SQLEXEC(oConn, "DROP TABLE IF EXISTS testdbf." + STRTRAN(LOWER(aFL(i,1)),".dbf", "")) && needed to remove tables already created when I was testing
sSQL = "CREATE TABLE testdbf." + STRTRAN(LOWER(aFL(i,1)),".dbf", "") + " ("
SELECT dbfstruct
GOTO TOP
DO WHILE NOT EOF()
@1,1 SAY "CREATING QUERY: " + aFL(i,1)
sSQL = sSQL + ALLTRIM(LOWER(dbfstruct.fldnm)) + " "
* You may have to add below depending on the field types of your DBFS
DO CASE
CASE ALLTRIM(dbfstruct.fldtype) == "Character"
sSQL = sSQL + "VARCHAR(" + ALLTRIM(STR(dbfstruct.fldlen)) + "),"
CASE ALLTRIM(dbfstruct.fldtype) == "Numeric" AND dbfstruct.fldpoint = 0
sSQL = sSQL + "INT(" + ALLTRIM(STR(dbfstruct.fldlen)) + "),"
CASE ALLTRIM(dbfstruct.fldtype) == "Numeric" AND dbfstruct.fldpoint > 0
sSQL = sSQL + "DECIMAL(" + ALLTRIM(STR(dbfstruct.fldlen)) + "),"
OTHERWISE
=MESSAGEBOX("Unhandled Field Type: " + ALLTRIM(dbfstruct.fldtype) ,0,"ERROR")
CANCEL
ENDCASE
SELECT dbfstruct
SKIP
ENDDO
sSQL = SUBSTR(sSQL, 1, LEN(sSQL)-1) + ")"
STORE SQLEXEC(oConn, sSQL) TO iSQL
IF iSQL < 0 THEN
CLEAR
?sSQL
STORE FCREATE("sqlerror.txt") TO gnOut && SQL of query in case it errors
=FPUTS(gnOut, sSQL)
=FCLOSE(gnOut)
=MESSAGEBOX("Error creating table on MySQL",0,"ERROR")
CANCEL
ENDIF
CLOSE DATABASES
ENDIF
ENDFOR
=SQLDISCONNECT(oConn)
SET DIRE TO (m.oPrgDir)
SET SAFETY ON