2009-09-11 74 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 *'