在Visual Basic中连接到DBF

时间:2014-04-08 10:49:08

标签: vbscript dbf dbase

我们有一个Windows应用程序,可以在DBF中存储数据。我需要连接到某个表a_sname.dbf并将SN_ACCOUNTSN_CURRBALSN_CRLIM列提取到要由其他应用程序导入的文本文件中。

理想情况下,文本文件需要看起来像。

SN_ACCOUNT     SN_CURRBAL     SN_CRLIM
10             100            1000
20             200            2000

以上只是一个例子。

目前我期待至少与DBF建立联系。

我有使用Oracle SQL知识的BASH脚本,但Windows方面对我来说都是新手。我将驱动器映射到Z:\


更新1:以下是我正在测试的脚本。

Option Explicit

Dim sDir : sDir = "Z:\"
Dim sCS  : sCS  = Join(Array( _
        "Provider=Microsoft.Jet.OLEDB.4.0" _
      , "Data Source=" & sDir _
      , "Extended Properties=""dBASE IV;""" _
), ";")
Dim oCN : Set oCN = CreateObject("ADODB.CONNECTION")
oCN.Open sCS
Dim oRS : Set oRS = oCN.Execute("SELECT SN_ACCOUNT,SN_CURRBAL,SN_CRLIM FROM a_sname.dbf")
Do Until oRS.EOF
   WScript.Echo oRS.Fields(0).Name, oRS.Fields(0).Value
   oRS.MoveNext
Loop
oCN.Close

我收到错误消息Microsoft JET Database Engine: External table is not in the expected format.


更新2 :以下是a_sname.dbf的表格信息的屏幕截图。

enter image description here


更新3:有效!这是我正在使用的查询。

SELECT SN_ACCOUNT,SN_CURRBAL,SN_CRLIM FROM a_sname.dbf

这是我正在使用的回声。

WScript.Echo oRS.Fields(0).Value, oRS.Fields(1).Value, oRS.Fields(2).Value

是否可以将所有这些传输到文本文件并使列间隔更均匀?

enter image description here

1 个答案:

答案 0 :(得分:0)

根据 source,ADODB.CONNECTION的连接字符串应如下所示:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\FileServer01\Server VFTP Dynamic\Data;
Extended Properties=dBASE IV;User ID=Admin;Password=;

您的第一个(测试)查询可能是

SELECT * FROM [a_sname.dbf]

如果遇到麻烦,我会

  1. \\FileServer01\Server VFTP Dynamic映射到驱动器号,相应地更改连接字符串,然后重试
  2. 使用数据源以交互方式/借助GUI建立连接,并使用此体验构建连接字符串
  3. <强>加了:

    一些经过测试的代码可以增强您的信心:

    Option Explicit
    
    Dim sDir : sDir = "\\gent\eh\...etc...\testdata\dbf"
    Dim sCS  : sCS  = Join(Array( _
            "Provider=Microsoft.Jet.OLEDB.4.0" _
          , "Data Source=" & sDir _
          , "Extended Properties=""dBASE IV;""" _
    ), ";")
    Dim oCN : Set oCN = CreateObject("ADODB.CONNECTION")
    oCN.Open sCS
    Dim oRS : Set oRS = oCN.Execute("SELECT TOP 2 * FROM [tblAbles]")
    Do Until oRS.EOF
       WScript.Echo oRS.Fields(0).Name, oRS.Fields(0).Value
       oRS.MoveNext
    Loop
    oCN.Close
    

    输出:

    cscript 22934726.vbs
    RTATID 2
    RTATID 3
    

    疑难解答I:

    1. 在您发布的代码中,sDir包含文件规范(“Z:\ a_sname.dbf”),而不是文件夹/目录规范
    2. Windows ??,??位(你需要在32位环境下工作吗?)
    3. ADO版本? WScript.Echo CreateObject("ADODB.Connection").Version
    4. 疑难解答II:

      1. 通过使用其他工具(Excel,Access,ODBC,...)打开它,确保a_sname.dbf是有效的.dbf(版本?)
      2. 调整“dBase IV”属性
      3. 疑难解答III:

        1. 请参阅here以获取文件标题中的版本

        2. 使用GUI(例如数据源)查找“dBase XX”的可能值

        3. 排除故障(不是dBase!)IV:

          1. 根据 来源,您可以/必须(?)使用特定于VFP的连接字符串:也许
            Provider=vfpoledb;Data Source=C:\MyDataDirectory\;Collating Sequence=general;

          2. 也许您需要download提供程序DLL(小心版本!)