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

Posted

技术标签:

【中文标题】如何以编程方式在 Access 中附加 DBF 文件?【英文标题】:How to attach DBF file in Access programmatically? 【发布时间】:2008-11-20 14:42:11 【问题描述】:

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

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

编辑:我想使用 Jet 并避免直接使用 MS Access。

【问题讨论】:

附加是指设置链接表关系还是类似的东西? 是的,这样DBF文件就链接到MDB了。 【参考方案1】:

也许How to quickly copy tables from an ODBC source to MS Access within a C# project 的这段代码可能会有所帮助:

您需要放置的 VB 函数 进入 MS Access 非常简单,并且 基本上调用 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 而不是 acImport 应该允许链接。

然后是 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 到另一个。

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

【讨论】:

所以,如果我错了,这将需要 Access 和 Access 自动化库。是否可以实现不使用 Access 的链接? 是的。我想避免使用 Access 应用程序本身 - 我的代码的用户可能不一定安装它,而 Jet 几乎无处不在。 我添加了一些使用 Jet 的脚本。【参考方案2】:

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

这是我在使用 Access 97 链接到 DBF 时得到的连接字符串(结果与 Access 2003 相同):

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

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

所以,我不确定您将提供什么作为连接字符串,但ConnectionStrings.com 有建议。但是,那些不使用 Jet 来访问数据,所以我只是不确定你会使用什么。

【讨论】:

以上是关于如何以编程方式在 Access 中附加 DBF 文件?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 CSV 数据导入 Access

如何以编程方式在运行时添加 Log4J2 附加程序?

除了记录集之外,如何以编程方式将项目添加到 ms 访问列表/组合框

如何以编程方式更改 Access 中的选项?

MS-Access 2007 - 如何在点击事件中以编程方式访问子表单列数据

.net中如何将网页中的数据导出成dbf(access)文件