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

时间:2008-11-20 14:42:12

标签: c# ms-access dbf

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

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

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

2 个答案:

答案 0 :(得分:3)

也许来自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
  

然后是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;
   }
}

更改VBA以读取acLink而不是acImport应该允许链接。

修改评论

我无法帮助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

答案 1 :(得分:1)

这只是一个建议,但是如何从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列中,但tabledef的.Connect属性是另一个MDB中Jet表的链接,与数据库列中的相同。

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