如何通过 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 数据
如何在 ms-access VBA 中检索表的 odbc 数据库名称