【问题标题】:Copy one access database into another database with C#使用 C# 将一个访问数据库复制到另一个数据库
【发布时间】:2011-03-30 06:37:16
【问题描述】:

是否可以以编程方式将一个数据库中的所有表复制到另一个可能已经包含表的数据库中(如果有任何重复的名称,当然会抛出异常)?这意味着在目标数据库中创建具有正确结构且名称与源数据库相同的表。

我发现了一些类似的问题,但没有一个有这种特殊需求。

我正在使用 Jet 引擎。

【问题讨论】:

  • 我知道这不是编程,但 access(至少 2010 年)在数据库工具下有一个“移动数据”选项,它将移动到 SQL Server 或另一个 Access 数据库,也许你可以利用它虽然是宏?

标签: c# .net ms-access jet


【解决方案1】:

找到解决办法:

string query = "SELECT * INTO [dest_table] FROM [source_table] IN '" + sourceDataBaseFileName + "'";
using (OleDbCommand sqlCeCommand = new OleDbCommand(query, DbConnection))
{
    sqlCeCommand.ExecuteNonQuery();
}

对源中的每个表执行此操作。 source_tabledest_table 可以同名。 DbConnection 是目标数据库。

【讨论】:

  • 这对解决预先​​存在的同名表的问题没有任何帮助。它还会创建缺少索引且不一定具有正确数据类型的表。
  • 为什么他们没有正确的数据类型?这不会创建表格的精确副本吗?
  • 你是对的,主键变成了普通列。但它们不会成为另一种数据类型。
  • 不,它不会创建表的完全副本。数据类型可能正确也可能不正确(我在考虑 MakeTables 的查询可能在 SELECT 语句中具有基于表达式的列;例如,如果列的计算结果为 Null,您将得到一个二进制字段)。除了缺少索引(不仅仅是没有创建的 PK,而是所有索引)之外,您还没有任何验证规则(字段级或表级),也没有任何外键约束。
【解决方案2】:

我意识到这是一个老问题。也许这个答案会对其他人有所帮助。

操作 Microsoft Access 的 COM 接口似乎提供了您所寻找的大部分内容。

  • 添加对“Microsoft Access xx.x 对象库”的引用
  • 创建并实例化“Microsoft.Office.Interop.Access.Application”类型的对象
  • 使用源数据库的参数调用 OpenCurrentDatabase
  • 使用目标数据库的参数、目标表的名称、对象类型 (AcObjectType.acTable) 和源表的名称调用 DoCmd.CopyObject
  • 调用 CloseCurrentDatabase

在 VB.Net 中是这样的:

acdb = New Microsoft.Office.Interop.Access.Application
acdb.OpenCurrentDatabase("source db")
acdb.DoCmd.CopyObject("target db", "target table name", Microsoft.Office.Interop.Access.AcObjectType.acTable, "source table name")
acdb.CloseCurrentDatabase()

我验证了表的复制是否正确,列类型、索引和键都正确。但是,如果目标表已经存在而没有任何警告或异常,它似乎会覆盖它。

有关详细信息,请参阅此 MSDN link

当我研究如何做到这一点时,我误解了我读到的内容,因为我认为这是 DAO。自从我使用 DAO 以来已经很长时间了,所以我没有意识到我的方式中的错误。谢谢戈德汤普森让我直截了当。

这确实需要在运行它的机器上安装 MSACCESS。更复杂的方法是使用 ADOX,恕我直言,它也有其自身的缺点。

这是 Office 2010。显然 YMMV 与其他版本。

如果有一天微软像他们告诉世界其他地方那样开始使用 .Net for Office 就好了。

【讨论】:

  • “我在其他地方读到 DAO 要求 Access 在运行它的 PC 上。” - 不,Access DAO 是 Access 数据库引擎的一部分,而不是一部分Microsoft Access (GUI) 应用程序本身。较旧的 32 位“Jet”DAO(仅适用于 .mdb 文件)包含在 Windows 中。较新的“ACE”DAO(适用于 .mdb 和 .accdb 文件)可免费下载 32 位和 64 位版本的 Access 数据库引擎再发行版。
  • 话虽如此,您提出的解决方案确实要求安装完整的 Access 应用程序,因为它确实使用 DAO;它使用 Microsoft Access 应用程序 (MSACCESS.EXE) 本身的 COM 自动化。 Access.Application 对象所需的引用是“Microsoft Access XX.X 对象库”,而不是“Microsoft Office XX.X Access 数据库引擎对象库”。
  • 谢谢。我在我的解决方案中混淆了我的参考资料。添加后,Visual Studio 将其显示为“Microsoft.Office.Interop.Access”并没有帮助。
猜你喜欢
  • 1970-01-01
  • 2014-03-12
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
相关资源
最近更新 更多