尝试 运行 来自 c# 应用程序的 Access 查询
Trying to run an Access query from a c# application
我创建了一个连接到 Access 数据库的 c# 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();
我不确定我是否明白你想要做什么,但如果你想 运行 现有的访问查询,你可以执行如下操作:
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;
这应该给了一些路要走。
好的,我们可以从 C# 连接到数据库引擎。好的,很好。
但现在我们不想使用C#,而是实际使用访问保存的查询。这些查询对于来自 C# 的 运行 来说将是非常有问题的,因为这些查询通常会使用 VBA 函数 - 你不会也不能调用 + 使用 VBA 函数您在 C# 中创建的查询。
因此,您甚至可以从访问容器中提取 sql 查询,但是当您尝试从 c# 中 运行 它们时,您需要使用 VBA 函数调用。现在,Access SQL 查询的重要部分确实坚持并仅使用 JET/ACE 数据引擎查询,但如果为 Access 应用程序开发的 Access sql 查询将(并且可以)仍然相当普遍自由地)在这些查询中使用 VBA 函数。所以,这是行不通的。
然而,这种叙述甚至变得更糟,因为你在此之上投入,现在需要并想要 运行 访问报告。那么,在这一点上,那么您不是在谈论与数据库的连接,而是再次使用 Access 对象模型并且您想要 运行 访问报告。再一次,Access 报告可能是 Access 最 "killer" 的功能之一。原因当然是Access报表也可以在报表中使用VBA。 (报告的打印、格式事件可以使用并具有 VBA 代码。结果当然比 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 时相同的命令。
因此,您可能 use/run 一些 sql 带有连接的查询(oleDB、ODBC 提供程序),但是如果那些 SQL 语句中包含 VBA,那么他们将无法工作。报告呢?如前所述,进一步深入兔子洞,到那时你还不如在这里启动 Access 而忘记 C#
请记住,如果您创建该 Access 实例并打开数据库?然后所有的访问启动代码甚至主窗体都会在您执行此操作时启动。如果 Access 吐出任何提示或对话框(或对话框窗体),那么您不能从 C# 中回答 "accessApp" 内的提示。因此,除非 Access 应用程序中的启动代码相对干净,否则自动化 Access 副本将是有问题的。
我创建了一个连接到 Access 数据库的 c# 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();
我不确定我是否明白你想要做什么,但如果你想 运行 现有的访问查询,你可以执行如下操作:
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;
这应该给了一些路要走。
好的,我们可以从 C# 连接到数据库引擎。好的,很好。
但现在我们不想使用C#,而是实际使用访问保存的查询。这些查询对于来自 C# 的 运行 来说将是非常有问题的,因为这些查询通常会使用 VBA 函数 - 你不会也不能调用 + 使用 VBA 函数您在 C# 中创建的查询。
因此,您甚至可以从访问容器中提取 sql 查询,但是当您尝试从 c# 中 运行 它们时,您需要使用 VBA 函数调用。现在,Access SQL 查询的重要部分确实坚持并仅使用 JET/ACE 数据引擎查询,但如果为 Access 应用程序开发的 Access sql 查询将(并且可以)仍然相当普遍自由地)在这些查询中使用 VBA 函数。所以,这是行不通的。
然而,这种叙述甚至变得更糟,因为你在此之上投入,现在需要并想要 运行 访问报告。那么,在这一点上,那么您不是在谈论与数据库的连接,而是再次使用 Access 对象模型并且您想要 运行 访问报告。再一次,Access 报告可能是 Access 最 "killer" 的功能之一。原因当然是Access报表也可以在报表中使用VBA。 (报告的打印、格式事件可以使用并具有 VBA 代码。结果当然比 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 时相同的命令。
因此,您可能 use/run 一些 sql 带有连接的查询(oleDB、ODBC 提供程序),但是如果那些 SQL 语句中包含 VBA,那么他们将无法工作。报告呢?如前所述,进一步深入兔子洞,到那时你还不如在这里启动 Access 而忘记 C#
请记住,如果您创建该 Access 实例并打开数据库?然后所有的访问启动代码甚至主窗体都会在您执行此操作时启动。如果 Access 吐出任何提示或对话框(或对话框窗体),那么您不能从 C# 中回答 "accessApp" 内的提示。因此,除非 Access 应用程序中的启动代码相对干净,否则自动化 Access 副本将是有问题的。