2009-09-11 68 views
1

我有一个MS Access数据库(Access 2002,用于记录)。它有一个名称包含问号的列,例如,表“用户”列“uid”和“isAdmin?”。我需要通过ODBC连接该数据库,并查询此列,大意如下:如何通过ODBC查询名称有问号的MS Access列?

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

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

一些限制:

  • 我不能轻易改变的列名。
  • 我不能轻易使用ODBC以外的其他方式进行连接,但如果我无法获得ODBC的行为,这可能是我的备用计划。
  • 我不能说select * from Users - 它仍然会按顺序呛(这在实际查询中很复杂,所以真的需要在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或什么的,但是这将是一个有点棘手,并在那一点上,我可以通过这些运行查询)。

+2

在列名问号!在MS Access团队中授权的人应该受到惩罚,并在未来10年内专门为MacDo提供服务! – 2009-09-11 10:35:39

回答

2

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

+0

好主意,但我忘了提及我根本无法轻易更改数据库,除了通过ODBC。不幸的是,我想通过ODBC创建视图会遇到和问号完全相同的问题。 – 2009-09-11 16:13:30

+0

事实证明,我可以在没有太多困难的情况下获得与数据库的额外非ODBC连接,因此我可以以这种方式创建视图(并将代码的其余部分通过ODBC运行),因此这将是最明智的方式去。但是,我设法完全避免了这个问题,所以我实际上还没有尝试过。 – 2009-09-13 06:51:23

2

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

select [uid], [isAdmin?] AS ISADMIN from Users order by [isAdmin?] 

(或者不管它是在本地SQL),
然后在Access,只是引用查询

select Uid, ISADMIN from qpstUsers 
+0

感谢您指出passthrough查询,我没有非常了解他们,他们可能是有用的。除了通过ODBC之外,不会轻易改变数据库,但是也许我仍然可以设置一个通过查询的方式。 – 2009-09-11 16:15:24

+0

呃,通过ODBC来传递数据喷气/ ACE?我认为passthroughs是Access功能,Access无法通过ODBC连接到Jet/ACE数据库,所以这不能成为解决方案。 – 2009-09-12 01:57:11

3

这可能看起来像一个狡猾的解决方案,但它听起来像你没有得到任何合理的帮助解决问题。

您是否拥有对MDB结构的写入权限?你有一个独立的访问副本?

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

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

另一种替代方法是,由于在MDB中使用适当的别名获取视图是一次性交易,因此假定您有OLEDB访问MDB的权限,则可以使用OLEDB执行此操作。

+0

我不得不说,我喜欢你的想法。 – 2009-09-13 06:49:15

+1

当有人要求你做一份工作时,我讨厌它,但不会给你所需的工具和支持,以便完成它。在这种情况下,最终解决限制就是公平的比赛,在我看来,即使严格来说,“违反规则”。服务用户比遵守规则更重要。 – 2009-09-13 18:27:48

0

试试这个“IsAdmin?”

双引号曾在我的情况,其中一个叫列:铅#

我的where子句则成了其中 “#铅”= '123'


我收回那句话...

其中([Lead#] = 123)

这就是救了我。注意围绕该子句的括号以及围绕我的参数123缺少单引号。希望这有助于。

1

我面临着同样的问题。 (使用来自SQLdeveloper的MS Access驱动程序)。

访问SQL不喜欢“'在 NOT LIKE ”* VAL *“ 然后我用 更换NOT LIKE '* VAL *'