代码之家  ›  专栏  ›  技术社区  ›  Filip Frącz

如何以编程方式在Access中附加DBF文件?

  •  2
  • Filip Frącz  · 技术社区  · 16 年前

    Access可以打开DBF(dBase)文件,但它没有将数据物理转换为MDB格式,而是能够链接到DBF表本身。这样,DBF就“链接”到MDB。

    是否可以使用C#以这种方式附加DBF文件?

    编辑

    2 回复  |  直到 16 年前
        1
  •  3
  •   June7    5 年前

    也许这段代码来自 How to quickly copy tables from an ODBC source to MS Access within a C# project

    你需要输入的VB函数 基本上调用TransferDatabase 方法,通过向其传递DSN(定点 到源数据库),一个源 代码如下:

    Public Function Import(dsnName As String, sourceTableName As String, targetTableName As String)
    ‘ if the table already existsm, delete it.
       On Error GoTo CopyTable
       DoCmd.DeleteObject acTable, targetTableName
    CopyTable:
       DoCmd.TransferDatabase _
       acImport, _
       "ODBC Database", _
       "ODBC;DSN=" + dsnName, _
       acTable, _
       sourceTableName, _
       targetTableName
    End Function
    

    将VBA更改为读取acLink而不是导入应该允许链接。

    然后是C代码:

    object accessObject = null;
    try
    {
       accessObject = Activator.CreateInstance(Type.GetTypeFromProgID("Access.Application"));
    
       accessObject.GetType().InvokeMember(
          "OpenCurrentDatabase",
          System.Reflection.BindingFlags.Default  System.Reflection.BindingFlags.InvokeMethod,
          null,
          accessObject,
          new Object[] { "AccessDbase.mdb" });
    
       accessObject.GetType().InvokeMember(
          "Run",
          System.Reflection.BindingFlags.Default  System.Reflection.BindingFlags.InvokeMethod,
          null,
          accessObject,
          new Object[] { "Import", "DSN Name", "Source table name", "Target table name" });
    
       accessObject.GetType().InvokeMember(
          "CloseCurrentDatabase",
          System.Reflection.BindingFlags.Default  System.Reflection.BindingFlags.InvokeMethod,
          null,
          accessObject,
          null);
    
       MessageBox.Show("Copy succeeded.");
    }
    catch (Exception ex)
    {
       string message = ex.Message;
       while (ex.InnerException != null)
       {
          ex = ex.InnerException;
          message += "\r\n----\r\n" + ex.Message;
       }
       MessageBox.Show(message);
    }
    finally
    {
       if (accessObject != null)
       {
          System.Runtime.InteropServices.Marshal.ReleaseComObject(accessObject);
          accessObject = null;
       }
    }
    

    我无法帮助您使用c#,但这里有一些VBScript,可以从 从一个MDB到另一个MDB。

    strLinkFile = "C:\Docs\Link.mdb"
    strAccessFile = "C:\Docs\LTD.mdb"
    
    'Create Link... '
    Set cn = CreateObject("ADODB.Connection")
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
           "Data Source=" & strAccessFile & ";" & _
           "Persist Security Info=False"
    
    Set adoCat = CreateObject("ADOX.Catalog")
    Set adoCat.ActiveConnection = cn
    
    Set adoTbl = CreateObject("ADOX.Table")
    
    Set adoTbl.ParentCatalog = adoCat
    adoTbl.Name = "LinkTable"
    
    adoTbl.properties("Jet OLEDB:Link Datasource") = strLinkFile
    adoTbl.properties("Jet OLEDB:Link Provider String") = "MS Access"
    adoTbl.properties("Jet OLEDB:Remote Table Name") = "Table1"
    adoTbl.properties("Jet OLEDB:Create Link") = True
    
    'Append the table to the tables collection '
    adoCat.Tables.Append adoTbl
    

    http://support.microsoft.com/kb/240222

        2
  •  1
  •   sth    11 年前

    这只是一个建议,但是如何从Access链接到DBF,然后查看Access用于获取数据的连接字符串。要单独使用Jet,您必须拥有Access用于访问xBase数据的ISAM。不过,我不确定这是Access组件还是Jet组件。

    dBase IV;HDR=NO;IMEX=2;DATABASE=C:\Path
    

    在MSysObjects表中,它位于CONNECT列中,dbf文件名位于DATABASE列中。指向Jet数据的链接在CONNECT列中没有任何内容,仅在DATABASE列中有,但作为指向另一个MDB中Jet表的链接的tabledef的.CONNECT属性与DATABASE列中的属性相同。

    所以,我不确定您将提供什么作为连接字符串,但是 ConnectionStrings.com 我有一些建议。然而,这些并没有使用Jet来访问数据,所以我不确定您将使用什么。