将Foxpro表导入SQL Server

时间:2018-01-09 14:17:33

标签: sql-server-2008 tsql visual-foxpro foxpro

我们有800个不同的.dbf文件,这些文件需要以文件名作为新表名加载到SQL Server中,因此必须将file1.dbf加载到SQL Server表file1中}。

像这样,我们需要将所有800个Foxpro表加载到SQL Server中。有没有人对此或脚本有所了解?任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:0)

该问题有多种解决方案。一种是使用VFP附带的升迁向导。我只试过原版,但一点也不好。从那时起我就没用过它。您可以尝试上传一个测试数据库,其中包含一个表,其中包含一百万行,只是为了查看使用它是否可行(百万行不应超过一分钟)。

我所做的是创建一个“生成器”,它将在我想要的映射中创建SQL服务器表(即:memo到varchar或varbinary MAX,char到varchar等)。然后使用我编写的基于C#的activex代码,我加载表 - 一次多个表(加载表的其他方式非常慢)。从那时起,该代码用于创建SQL服务器表和/或将现有客户的数据传输到SQL服务器。

另一种有效的方法是,使用VFPOLEDB创建一个链接服务器到VFP,然后使用OpenQuery获取表的结构和数据:

select * into [TableName] 
from OpenQuery(vfpserver, 'select * from TableName ...')

这个也很快,允许您在查询中使用VFP特定的函数,但是结果字段类型可能不是您喜欢的。

答案 1 :(得分:0)

下面是一个用FoxPro 9编写的解决方案。您可能需要修改一下,因为我只处理了3种数据类型。您还必须注意SQL保留字作为字段名称。

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