我有一个MS Access数据库(Access 2002,用于记录)。它有一个列,其名称包含一个问号,例如,表“Users”,其列为“uid”和“isAdmin?”。我需要通过ODBC连接到此数据库,并按以下行查询此列:
select [uid], [isAdmin?] from Users order by [isAdmin?];
如何转义列名中的问号,以便MS Access 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或其他任何东西)之外我根本无法轻易更改数据库,但这会有点棘手,在那一点上,我可以通过那些运行查询。
答案 0 :(得分:3)
这似乎是一种狡猾的解决方案,但听起来你没有得到任何合理的帮助来解决这个问题。
您是否具有MDB结构的写入权限?你有独立访问的副本吗?
如果是这样,请创建一个新的空白MDB文件(完成后将放弃此文件)。从新MDB创建一个链接表,并使用它来编写一个保存的QueryDef,它将该字段别名化。然后使用DoCmd.TransferDatabase将其从临时MDB导出到真实MDB中。
这假设您具有通过ODBC从应用程序访问的MDB的SMB文件系统访问权限。
另一种选择,因为在MDB中获得具有适当别名的视图是一次性交易,将使用OLEDB执行此操作,假设您具有对MDB的OLEDB访问权。
答案 1 :(得分:2)
我会使用pass through queries并重命名查询中的字段。通过类似
之类的内容创建传递 select [uid], [isAdmin?] AS ISADMIN from Users order by [isAdmin?]
(或本机SQL中的任何内容),
然后在Access中,只引用该查询
select Uid, ISADMIN from qpstUsers
答案 2 :(得分:2)
另一种选择是创建Users
表的视图并重命名视图中的违规列。
答案 3 :(得分:1)
我遇到了同样的问题。 (使用SQLdeveloper中的MS Access驱动程序)。
ACCESS SQL不喜欢'"'如在 不喜欢" * val *" 然后我换成了 不喜欢' * val *'
答案 4 :(得分:0)
试试这个“IsAdmin?”
双重引号适用于我的情况,其中有人将该列命名为:Lead#
我的where子句随后成为“Lead#”='123'
的地方我把它拿回来......
其中([Lead#] = 123)
这就是救我的。请注意该子句周围的括号以及参数123周围缺少单引号。希望这会有所帮助。