好的,所以我们可以从 c# 连接到数据库引擎。好的,一切顺利。
但是现在我们不想使用 C#,而是实际使用访问保存的查询。从 C# 运行这些查询将是非常有问题的,因为这些查询通常会使用 VBA 函数 - 您不会也不能在 C# 中创建的查询中调用 + 使用 VBA 函数。
因此,您甚至可以从访问容器中提取 sql 查询,但是当您尝试从 c# 运行它们时,您需要使用 VBA 函数调用。现在,Access SQL 查询的很大一部分确实坚持并且只使用 JET/ACE 数据引擎查询,但是如果为 Access 应用程序开发的 Access sql 查询将(并且可以自由地)在这些查询中使用 VBA 函数,仍然相当普遍。所以,这是行不通的。
但是,这种叙述甚至变得更糟,因为您在此基础上投入了需要并希望现在运行 Access 报告。好吧,此时,您不是在谈论与数据库的连接,而是再次使用 Access 对象模型并且您想要运行 Access 报告。再一次,Access 报告可能是 Access 最“杀手级”的功能之一。原因当然是Access报表也可以在报表中使用VBA。(打印时,报表的格式事件可以使用并具有 VBA 代码。结果当然 i 甚至比 SQL 报表服务更好,事件代码 (VBA) 可以在报表中用于报表的详细部分部分 - 超越强大结果是。
因此,我建议您忘记与 Access 数据库引擎的连接(如果您使用 .net oleDB 提供程序或 .net ODBC 提供程序,这就是您所获得的全部)。您没有提及您正在使用哪个提供程序进行 .net 连接,但 oleDB 提供程序或 ODBC 提供程序当然无法运行和使用来自 c# 的 VBA 代码。
最终结果?您必须将 Access 的副本作为对象启动,然后告诉该对象运行或打印报告。实际上,您甚至不需要也不需要来自 c# 的连接,而只需要创建一个 Access 实例。
例如:
{
object accessApp;
accessApp = createObject("Access.Application");
accessApp.OpenCurrentDataBase(@"C:\MDb\Invoices.accDB");
accessApp.Run("TimeUpDate");
accessApp.Quit();
}
上面会调用 + 运行一个名为 TimeUpdate 的 VBA 子程序,它可以做任何事情。
您还可以使用以下命令将报告运行到默认打印机
accessApp.DoCmd.OpenReport ("rptInvoice");
换句话说,就像您可以创建 word 或 Excel 的实例一样,或者在本例中为 Access?您不会连接到 Access,而是创建 Access 应用程序的一个实例,然后执行与启动 Access 相同的命令。
因此,您可能可以通过连接(oleDB、ODBC 提供程序)使用/运行一些 sql 查询,但如果这些 SQL 语句具有 VBA,那么它们将无法工作。而对于报告?如上所述,这将进一步深入兔子洞,此时您不妨在这里启动 Access 并忘记 C#
请记住,如果您创建该 Access 实例并打开数据库?然后,当您执行此操作时,所有访问启动代码甚至主窗体都将启动。如果 Access 吐出任何提示或对话框(或对话框形式),那么您不能使用 C# 来回答“accessApp”内的提示。因此,除非 Access 应用程序中的启动代码相对干净,否则自动复制 Access 将是有问题的。