0

我创建了连接到 Access 数据库的 ac# windows 应用程序。

我与数据库的连接非常好,但是有没有办法运行我的 Access 开发的查询,以便用户可以轻松地打印结果?我知道我可以在 c# 中创建报告,但只想使用已经在 Access 中开发的报告。查询是 qrySuppliers

// setup connection con to our database    
OleDbConnection con = new OleDbConnection("Provider = 
Microsoft.ACE.OLEDB.12.0; Data Source = Database3.accdb");

// create command object and open it
OleDbCommand cmd = con.CreateCommand();
con.Open();
4

2 回答 2

0

我不确定我是否得到了您想要做的事情,但如果您尝试运行现有的访问查询,您可以执行以下操作:

OleDbConnection conn = new OleDbConnection(@ "Provider = 
Microsoft.ACE.OLEDB.12.0; Data Source = Database3.accdb");
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "YOUR_QUERY_NAME";

如果您查询需要任何参数,则将它们设置如下..

cmd.Parameters.AddWithValue("@ParameterName", "YOUR_PARAMETER_VALUE"); 

谢谢,因为它是一个 Windows 应用程序,我假设您需要将它填充到数据表或其他东西中。所以你可以这样做:

OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);

如果您的表单上已经有一个网格和数据源,那么您可以将其绑定为:

bindingSource1.DataSource = dt;
this.dataGridView1.DataSource = bindingSource1;

这应该给一些路要走。

于 2020-04-09T03:54:23.210 回答
0

好的,所以我们可以从 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 将是有问题的。

于 2020-04-10T00:22:58.910 回答