Access 可以打开 DBF (dBase) 文件,但不是将数据物理转换为 MDB 格式,而是能够链接到 DBF 表本身。这样,DBF 就“链接”到了 MDB。
是否可以使用 C# 以这种方式附加 DBF 文件?
编辑:我想使用 Jet 并避免直接使用 MS Access。
可能来自如何在 C# 项目中将表从 ODBC 源快速复制到 MS Access 中的这段代码可能会有所帮助:
您需要放入 MS Access 的 VB 函数非常简单,基本上通过传递 DSN(指向源数据库)、源表名和目标表名来调用 TransferDatabase 方法。代码如下:
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 链接到 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 来访问数据,所以我只是不确定你会使用什么。