2009-01-20 52 views
9

我正在查詢可能會更改的視圖中的數據。在執行crs.get******()之前,我需要知道該列是否存在。我發現可以像這樣查詢元數據,以便在我向它請求數據之前查看列是否存在。如何檢查CachedRowSet中是否存在列名?

ResultSetMetaData meta = crs.getMetaData(); 
int numCol = meta.getColumnCount(); 

for (int i = 1; i < numCol+1; i++) 
    if(meta.getColumnName(i).equals("name")) 
     return true; 

是否有一種更簡單的方法來檢查列是否存在?編輯: 它必須是數據庫不可知的。這就是爲什麼我引用CachedRowSet而不是數據庫。

回答

8

有不一般的JDBC API(至少不是我所知道的,或者可以找到...我有恰好我家種的工具集相同的代碼。)

一個簡單的方法(您的代碼是不完整):

ResultSetMetaData meta = crs.getMetaData(); 
int numCol = meta.getColumnCount(); 

for (int i = 1; i < numCol+1; i++) 
{ 
    if(meta.getColumnName(i).equals("name")) 
    {return true;} 

} 
return false; 

話雖這麼說,如果你使用專有的,特定於數據庫的API和/或SQL查詢,我相信你能找到做同樣的事情的更優雅的方式。 ..但是你必須爲你需要處理的每個數據庫編寫自定義代碼。如果我是你,我會堅持使用JDBC API。

是否有關於您提出的解決方案的問題,使您認爲它不正確?這對我來說似乎很簡單...

+0

我是cachedRowSet的新手,我在寫我的問題時就明白了這一點。以一致的方式提出問題讓我以不同的角度思考問題。只要確保我保持正確的軌道。 – WolfmanDragon 2009-01-20 18:53:40

1

哪個數據庫?

我認爲在Oracle中有列表的列列出。

我不記得是否對意見的工作也行,不過我想他們這樣做,它是這樣的:

select colum_name from all_views where view_name like 'myview' 

select name from all_objects where object_name like 'myview' and object_type='view' 

我不記得確切的語法。儘管如此,你應該擁有空間權限。

每個RDBMS應該有類似的東西。

您也可以執行查詢

select * from myView where 1 = 0 ; 

而且從元數據獲得列,如果你想避免讀取數據之前知道,如果列存在的東西。

+0

它必須是數據庫不可知的。我從未與Oracle合作過,但可能很快就會這樣做。 +1瞭解有關Oracle視圖的更多信息。 – WolfmanDragon 2009-01-20 18:57:32

+0

然後從myview中選擇*,其中1 = 0應該這樣做。儘管使用RsMd但速度相當快。 – OscarRyz 2009-01-21 01:00:43

1

不,真的沒有更好的方法。你可能想重新審視這個問題。如果您可以重新定義問題,有時它會使解決方案變得更簡單,因爲問題已經改變。

0

警告:單純從內存如下評論沒有任何配套的文書工作:)

如果我沒有記錯有當oracle緩存行集實現與連接使用的撫養它曾經那麼難看,頭一個神祕的問題池。看起來有一個對緩存行集對象中保持連接的靜默引用(即使它應該斷開連接),這會關閉隨後在垃圾回收池中打開的另一個連接。出於這個原因,我最終放棄了並編寫了自己的數據對象層(這些日子我會把它交給彈簧&休眠)。

7

如果列不在CachedRowSet中,您可以採用使用findColumn()將爲InvalidColumName拋出SQLException的事實的較短方法。

例如

try { 
    int foundColIndex = results.findColumn("nameOfColumn"); 
} catch { 
    // do whatever else makes sense 
} 

可能的異常的處理的濫用(每EffectiveJava第二版項目57),但它是通過從元數據中的所有列循環的替代方案。