如何通过 ODBC 查询名称带有问号的 MS Access 列?

Posted

技术标签:

【中文标题】如何通过 ODBC 查询名称带有问号的 MS Access 列?【英文标题】:How to query for a MS Access column whose name has a question mark, via ODBC? 【发布时间】:2009-09-11 08:04:49 【问题描述】:

我有一个 MS Access 数据库(Access 2002,作为记录)。它有一个名称包含问号的列,例如表“Users”,列“uid”和“isAdmin?”。我需要通过 ODBC 连接到该数据库,并按照以下方式查询该列:

select [uid], [isAdmin?] from Users order by [isAdmin?];

如何转义列名中的问号,使 MS Access ODBC 驱动程序不认为它是查询参数?这个查询不使用任何参数,所以我完全禁用它们也没关系。

一些限制:

我无法轻易更改列名。 我不能轻易使用 ODBC 以外的东西进行连接,但如果我无法让 ODBC 正常工作,这可能是我的后备计划。 我不能只说select * from Users——它仍然会卡住 order by(这在实际查询中很复杂,因此确实需要在 SQL 中完成)。

我尝试过但不起作用的方法:

select [uid], '[isAdmin?]' from Users; -- 这使得第二列成为字符串“[isAdmin?]” select [uid], ['isAdmin?'] from Users; select [uid], [isAdmin\?] from Users; select [uid], [isAdmin\?] escape '\' from Users; -- 任何其他转义字符也不起作用。 select [uid], [isAdmin?] from Users;

编辑:我应该澄清一下,除了通过 ODBC(或 ADO 或 DAO 或其他方式)之外,我根本无法轻易更改数据库,但这会有点棘手,而且那时我可以通过这些运行查询)。

【问题讨论】:

列名中的问号!在 MS Access 团队中授权它的人应该受到惩罚,并在接下来的 10 年里只吃 MacDo's! 【参考方案1】:

这似乎是一个迂回的解决方案,但听起来您没有得到任何合理的帮助来解决问题。

您对 MDB 的结构有写入权限吗?你有独立访问的副本吗?

如果是这样,请创建一个新的空白 MDB 文件(完成后您将丢弃它)。从新的 MDB 创建一个链接表,并使用它来编写一个已保存的 QueryDef,该字段为该字段起别名。然后使用 DoCmd.TransferDatabase 将它从您的临时 MDB 导出到真实的。

这假定您对通过 ODBC 从应用程序访问的 MDB 具有 SMB 文件系统访问权限。

另一种选择是,由于在 MDB 中获取具有适当别名的视图是一次性的,因此假设您具有对 MDB 的 OLEDB 访问权限,则使用 OLEDB 执行此操作。

【讨论】:

我不得不说,我喜欢你的想法。 我讨厌有人要求你做一份工作,但不会给你完成工作所需的工具和支持。在那种情况下,在我看来,绕开限制跑是公平的游戏,即使严格来说,这是“违反规则”。为用户服务比遵守规则更重要。【参考方案2】:

另一种选择是创建Users 表的视图并重命名视图中的违规列。

【讨论】:

好主意,但我忘了提到我根本无法轻易更改数据库,除非通过 ODBC。不幸的是,我想通过 ODBC 创建视图会遇到与问号完全相同的问题。 事实证明,我可以毫不费力地获得与数据库的额外非 ODBC 连接,因此我可以以这种方式制作视图(并让我的其余代码在 ODBC 上运行),并且所以这将是最明智的做法。但是,我设法完全避免了这个问题,所以我实际上还没有尝试过。【参考方案3】:

我会使用pass through queries 并重命名查询中的字段。通过类似

的方式创建您的通行证
 select [uid], [isAdmin?] AS ISADMIN from Users order by [isAdmin?]

(或本机 SQL 中的任何内容), 然后在 Access 中,只需引用该查询

select Uid, ISADMIN from qpstUsers

【讨论】:

感谢您指出直通查询,我并不是很了解它们,它们可能很有用。不幸的是,除了通过 ODBC 之外,我无法真正轻松地更改数据库,但也许我仍然可以通过这种方式设置直通查询。 呃,通过 ODBC 到 Jet/ACE 的直通是否有效?我认为直通是 Access 的一项功能,而 Access 无法通过 ODBC 连接到 Jet/ACE 数据库,所以这不是解决方案。【参考方案4】:

我遇到了同样的问题。 (使用 SQLdeveloper 的 MS Access 驱动程序)。

ACCESS SQL 不喜欢 '"' 如 不像“*val*” 然后我替换为 不像'*val*'

【讨论】:

【参考方案5】:

试试这个“IsAdmin?”

双引号在我的情况下有效,有人将列命名为:Lead #

然后我的 where 子句变成 where "Lead #" = '123'


我收回了……

哪里 ([Lead #] = 123)

这就是拯救我的原因。请注意子句周围的括号以及我的参数 123 周围缺少单引号。希望这会有所帮助。

【讨论】:

以上是关于如何通过 ODBC 查询名称带有问号的 MS Access 列?的主要内容,如果未能解决你的问题,请参考以下文章

带有“返回记录:否”的 MS Access 直通查询截断 ODBC 连接字符串

具有用户功能条件的 MS Access 查询停止处理 odbc 数据

如何避免问号字符的 ODBC 参数化?在文字和评论中?

如何在 ms-access VBA 中检索表的 odbc 数据库名称

如何使用 MySQl 的 ODBC 连接器在 MS Access 中的 VBA 中执行和查询?

通过 ODBC 连接到 SQL Server 的 Access 中的 MS SQL 查询