【问题标题】:SQL server table to FoxPro table issuesSQL server 表到 FoxPro 表的问题
【发布时间】:2012-09-19 22:19:06
【问题描述】:

我正在尝试将一些 SQL 服务器表放入 FoxPro dbf。

我成功地 bcp 导出数据,这样当我使用 FoxPro 导入向导时,数据可以正确导入。但是当我尝试在命令行中执行此操作时,我最多只能导入前几列,而所有其他列都消失了。

在下面的目录中,我把.CSV文件和成功的DBF导入表都放了。

directory with 2 files here

我需要弄清楚的是如何从 FoxPro 的命令行导入这些 CSV 文件。

我尝试了各种组合;

APPEND FROM D:\work\oh\output\sqloutput.csv TYPE CSV
APPEND FROM D:\work\oh\output\sqloutput.csv DELIMITED WITH TAB

这些都不起作用。

有什么想法吗?我知道我以前这样做过,我不记得诀窍是什么......

【问题讨论】:

    标签: sql sql-server tsql foxpro bcp


    【解决方案1】:

    哇..我认为您的做法是错误的...只需对 SQL 数据库执行一个简单的 SQLCONNECT(),对数据源、存储过程或其他任何内容运行查询,然后它就在游标中VFP...然后,您可以“复制”到 DBF 就完成了...类似于

    lnH = SQLCONNECT()
    

    (为您弹出 ODBC 连接对话框)。

    如果不是这样,你可以这样做

    lnH = SQLStringConnect("Provider=... for sql server, server name, etc")
    

    然后

    if lnH > 0
       sqlexec( lnH, "select * from someTableOnServer where whateverConditon", "C_LocalCursor" )
    
       select C_LocalCursor
       copy to PermanentTable
    
       sqldisconnect( lnH )
    endif 
    

    现在,如果有超过 10 个字符的列名的列,并且您没有使用数据库容器,则可能需要通过将查询更改为 GET 列名或重新选择一次数据来进行调整本地以适应 10 个字符的非 dbc 表上下文。

    构建查询的另一个示例可能是——为了在键入时便于阅读,我使用 text/endtext 例如

    text to lcSQLCmd noshow pretext 1+2
       select
             t1.Column1,
             t1.AVeryLongColumnName as AVLColName,
             t1.AnotherLongColumn2  as ALC2,
             t1.SomeFlag,
             t2.ColumnFromAnotherTable as CFATbl,
             t2.AnotherCol
          from
             SQLDatabase.dbo.SQLTable1 t1
                join SQLDatabase.dbo.SQLTable2 t2
                   on t1.SomeKey = t2.SomeKey
          where
             t1.SomeCriteria = 'whatever'
          order by
             t1.SomeFlag
    endtext
    
    */ Then, to "clean up" the string for VFP to pass properly, 
    */ strip out the cr/lf from the text such as
    lcSQLCmd = chrtran( lcSQLCmd, chr(13)+chr(10), "" )
    
    */ THEN, pass this command through sqlexec()
    sqlexec( lnH, lcSQLCmd, "C_LocalCursor" )
    

    第二个显然更容易阅读您想要获取的内容,并注意我还预先将长列名缩短为 VFP 10 char 非 DBC 列名限制。然后,像第一个例子一样复制出来。

    【讨论】:

    • 非常感谢您富有洞察力和详细的回复。我很少再在 FoxPro 中工作,根本没有考虑过这种方法。 (有时,当一个人非常接近使用另一种方法的有效解决方案时,甚至不会考虑改变策略。)这非常有效,我也学到了一些东西。谢谢。
    【解决方案2】:

    接收 FoxPro 表中的所有字段是否与您尝试添加到其中的 CSV 中的列具有相同的顺序和相同的数据类型?它们都足够大以处理数据吗?您是否确保 CSV 中的所有文本字段都不在其文本中包含字段分隔符?

    【讨论】:

    • 是的,是的。如果文本字段意外包含字段分隔符,我希望导入会打破中间记录,至少成功导入了开头的 X 条记录。(我认为?)
    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多