[英]How do I check to see if a column name exists in a CachedRowSet?
我正在查詢可能會發生變化的視圖中的數據。 在我執行crs.get******()
之前,我需要知道列是否存在。我發現我可以查詢這樣的元數據,以便在我從中請求數據之前查看列是否存在。
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
而不是數據庫的原因。
一般的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。
您提出的解決方案是否存在讓您認為不正確的問題? 這對我來說似乎很簡單......
如果列不在CachedRowSet中,你可以采用較短的方法來使用findColumn()為InvalidColumName拋出SQLException這一事實。
例如
try {
int foundColIndex = results.findColumn("nameOfColumn");
} catch {
// do whatever else makes sense
}
可能是濫用異常處理(根據EffectiveJava第2版第57項),但它是循環遍歷元數據中所有列的替代方法。
哪個數據庫?
我認為在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 ;
並且從元數據中獲取列,如果您希望它在以前知道列是否存在之前避免獲取數據。
不,真的沒有更好的方法。 您可能想要重新查看問題。 如果您可以重新定義問題,有時它會使解決方案更簡單,因為問題已經改變。
警告:以下評論純粹來自內存而沒有任何支持文書工作:)
如果我沒記錯的話,當oracle緩存的行集實現與連接池一起使用時,有一個神秘的問題會讓它變得如此丑陋。 似乎存在對緩存的行集對象中保持的連接的靜默引用(即使它應該斷開連接),這會關閉隨后在垃圾收集池中打開的另一個連接。 出於這個原因,我最終放棄並編寫了自己的數據對象層(這些天我將其交給spring和hibernate)。
舊線程,但我剛遇到同樣的問題,最終得到了一個實用功能:
private Set<String> getColumnNames(ResultSet cached) throws SQLException {
ResultSetMetaData metaData = cached.getMetaData();
return IntStream.range(1, metaData.getColumnCount())
.mapToObj(i -> {
try {
return metaData.getColumnName(i);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}).collect(toSet());
}
如果我們不必在lambda中捕獲異常(沒有一些丑陋的黑客),這將是非常好的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.