当数据在 SQL Server 中时,如何通过 ADO 在 Access 中创建报表?
Posted
技术标签:
【中文标题】当数据在 SQL Server 中时,如何通过 ADO 在 Access 中创建报表?【英文标题】:How to create reports in Access via ADO When data is in SQL Server? 【发布时间】:2010-08-20 22:04:46 【问题描述】:我有一个 Access 2003 项目,其中所有数据都存储在 SQL Server 2008 中。我正在使用 ADO 通过完全未绑定的表单查看/更新数据。例如,一个表单上有几个文本框和组合框。加载表单后,我使用 ADO 调用 SQL SQL 上的存储过程,它返回一个记录集,然后我通过 VBA 使用记录集中的数据填充控件。我喜欢这种方法,因为只有 VBA 存储在 Access 中。没有数据(实际上连接字符串存储在 Access 中,但就是这样!)。
我的问题是在报告方面该怎么做。我想创建基于 SQL Server 中创建的视图的报告,但是如果可能的话,我想避免直接从 Access 中静态链接到视图。是否可以在运行时动态地将报表的记录源设置为 SQL Server 视图的结果?如果是,如何设计报表 id Access 不包含任何数据?
更多信息...我想避免链接到 Access 中的视图的原因是 Access 应用程序可以运行的环境发生变化(生产、开发、测试)。目前,每当我对数据库存储过程进行任何调用时,我都会在 Access 中存储的唯一表中查找连接字符串(基于 Active Directory,因此不存储密码)。
感谢您的帮助。
【问题讨论】:
您为什么要使用 Access?通过无限制地做所有事情,您完全丧失了 Access 的所有优势。为什么 ADP 不会更好? 我正在使用 Access,因为项目主管强制要求它。 “当权者”更喜欢 Access 解决方案,因为他们已经拥有如此多的内部 Access 应用程序。有趣的是,这些“内部”应用程序都没有使用 SQL Server 作为后端。它们都是您的标准 MDB。我个人更喜欢“Winforms”.NET 解决方案,但这不是我的决定。这就是开发者的生活。 难道他们没有使用 Access 获得这一点,而是手动进行所有数据访问会浪费掉 Access 开发人员至少 50% 的知识吗? 【参考方案1】:首先让我们明确一点:您没有 Access 2003“项目”。您有一个 Access 2003 数据库。
实际的 Access 数据项目不能有本地表,并且使用 SQL Server 作为后端。当您查看表时,您会看到服务器上存在的表,而在查询下,您会看到服务器上存在的视图、函数和存储过程。您可以使用“Upsize Wizard”将 Access 数据库转换为 Access 数据项目(或者可能更好,只需创建一个新的 ADP(Access 数据项目)并导入所有表单、报表、宏和模块。
这是我的想法:
将数据库转换为实际的 Access 数据项目,然后只使用常规的旧查询,就好像它们被寻址到本地数据库一样。您甚至可以将表单绑定到存储过程,并且它们可以更新。要处理生产、开发和测试,您只需在 GUI 中更改连接字符串,或者通过如下代码进行更改:
Application.CurrentProject.CloseConnection
Application.CurrentProject.OpenConnection NewConnString
如果您想从集中式数据库或共享上的文本文件或从您在每个环境中加载的公用表(具有每个其他环境的连接信息)中读取连接字符串,这取决于。我有一个 Access Data Project,它有一个带有 Environment 下拉菜单的工具栏。切换环境时,会填充一个子数据库下拉列表,最后通过事件通知所有打开的表单(尽管发生这种情况时绑定的表单会关闭)。
使用链接表没有任何问题。只需编写一个循环遍历所有表并更新它们以在您想要更改环境时指向正确的服务器的过程。 “静态”链接和“动态”链接之间的区别只是一个 VB 程序,它遍历所有表并重新链接它们——很容易。
在运行时动态设置报表记录集是有问题的。在实际的 Access Data 项目中可能是可能的,但在常规 MDB 中绝对不可能。
您可以在 Access MDB 中创建传递查询,但我不确定是否要传入参数。您可能必须使用硬编码的参数动态设置查询文本,然后运行报告。这对于多用户数据库来说是个问题,除非每个人都有自己的前端来运行。
我建议您使用选项 1 或 2。选项 1 似乎最简单,但在您能够轻松使用 ADP 而不是 MDB 之前,还有一些学习要做。如果您认为自己会走这条路,请告诉我,我将与您分享一些问题。但是,它可能比您现在手动执行的操作更容易。 (哎呀!)第二个选项是立即实施的最快方法,而且不会对您当前的 MDB 技能造成任何影响。
更新
因此,如果您想链接表,这里有一些代码可以帮助您入门:
Sub TableRelink(MdbPath As String)
Dim Table As DAO.TableDef
Dim Tables As DAO.TableDefs
Set Tables = CurrentDb.TableDefs
For Each Table In Tables
If Table.SourceTableName <> "" Then 'If a linked table
Table.Connect = ";DATABASE=" & MdbPath 'Set the new source
Table.RefreshLink
End If
Next
End Sub
此代码适用于 MDB 文件,但一些挖掘将很快为您提供用于 SQL Server 链接表的正确属性和值。
另一个想法
我刚刚想到了另一种可能的方法来处理您遇到的问题:在 Access 中使用会话键控“临时”表。创建一个本地表,其中包含视图返回的所有列以及一个 GUID 列。运行报表时,将视图的内容插入到本地表中,并以新的 GUID 值作为键。将报告的记录源设置为 SELECT * FROM MyViewTempTable WHERE GUID = 'GUID'。简单的问题解决了。在 report_close 上,从表中删除。也可以输入一个日期并在 10 天后删除,以防留下任何行。
【讨论】:
ADP 或多或少已被 Microsoft 删除,但它们可能会在未来某个时间恢复。 Access 2010 仅对 ADP (technet.microsoft.com/en-us/library/cc179181.aspx) 提供有限支持。我认为选项 2 是最好的选择。 对于完全不受约束地使用 Access 的人来说,在我看来,ADP 应该是一个巨大的改进,即使它实际上已被弃用——最初的提问者一开始就没有使用推荐的做法,所以在我看来,与 ADP 合作会更上一层楼。 我使用链接表没有问题。到目前为止,还不需要它们。所有数据访问都是通过存储过程完成的。当然,绑定的表单和控件有它们的位置,但不在此应用程序中。没有逐条记录数据分页的概念,这是我们使用绑定表单的唯一原因。 ADP 项目已弃用并防止安全风险。我不希望用户在 Access 中创建自己的“存储过程”,这是 ADP 可能允许的风险。 ADP 不会允许任何类型的事情,除非您已经完全加强了 SQL Server 中的安全性和角色!以上是关于当数据在 SQL Server 中时,如何通过 ADO 在 Access 中创建报表?的主要内容,如果未能解决你的问题,请参考以下文章
当表在不同的架构中时,如何从 SQL Server 导入所有带有 sqoop 的表?
如何通过 C# ASP.net 从 SQL Server 中的文本框中存储日期
MS SQL Server 在空格上拆分单词,但仅在不在双引号中时
当信息存储在辅助表中时,如何在 SQL 中查询页面的最新版本?