2013-01-25 50 views
0

我想獲取表名中有特殊字符的表的元數據。在正常情況下,我的代碼工作正常,但我有一個表「TABLE []} \ | ABC」,其中getColumns沒有返回任何值。DatabaseMetadata.getColumns問題與sql服務器jdbc驅動程序

ResultSet rrc = meta.getColumns("SCHEMA_NAME", null, "TABLE_NAME", "%"); 

此外,還有一些奇怪的行爲,我發現。只需在第一個參數中傳遞模式名稱,並在其餘3個參數中傳遞任何其他值。

ResultSet rrc = meta.getColumns("SCHEMA_NAME", null, null, "%"); 
while (rrc.next()) { 
    System.out.println("-- col: " + rrc.getString(4)); 
} 

只要改變rrc.getString(4)(COLUMN_NAME)rrc.getString(3)(TABLE_NAME)或添加其他組合,找到您收到了同樣的結果集的記錄數。它會根據您的選擇而有所不同。

+1

這個表真的名爲'TABLE []} \ | ABC'嗎?另外,我不清楚你的問題的第二部分是什麼意思。您可能想在此添加一些說明。 –

+0

是的。表名是「TABLE []} \ | ABC」 – Mehul

回答

0

DatabaseMetaData.getColumns(...)的第三個參數叫做tableNamePattern。這是一個LIKE模式,而不是文字。在LIKE模式中,反斜線(\)是一個轉義字符。因此,如果要匹配名爲TABLE[]}\|ABC的表,則需要使用TABLE[]}\\|ABC(注意雙斜槓)模式,它作爲Java字符串將是"TABLE[]}\\\\|ABC"

+0

發送第三個參數時,我使用的是「\\」,這是Java認爲'\'顯而易見的轉義字符。但我不認爲這是一個問題。 – Mehul

+0

對不起,我從一個純粹的SQL角度談論,作爲一個Java字符串,你將需要使用'\\\\\'。 –

+0

表只有一個\但從Java的角度來看,我需要逃避它,所以我又添加了一個\。這就是表中有2個反斜槓的原因。 – Mehul

相關問題