如何检查CachedRowSet中是否存在列名?

时间:2009-01-20 18:39:55

标签: java jdbc metadata 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而不是数据库的原因。

7 个答案:

答案 0 :(得分: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。

您提出的解决方案是否存在让您认为不正确的问题?这对我来说似乎很简单......

答案 1 :(得分:8)

如果列不在CachedRowSet中,你可以采用较短的方法来使用findColumn()为InvalidColumName抛出SQLException这一事实。

例如

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

可能滥用异常处理(根据EffectiveJava第2版第57项),但它可以替代循环使用元数据中的所有列。

答案 2 :(得分: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 ; 

从元数据中获取列,如果您希望它在避免获取数据之前知道列是否存在。

答案 3 :(得分:1)

不,确实没有更好的方法。您可能想要重新查看问题。如果您可以重新定义问题,有时它会使解决方案更简单,因为问题已经改变。

答案 4 :(得分:0)

警告:在没有任何支持性文书工作的情况下,纯粹从记忆中发表评论:)

如果我没记错的话,当oracle缓存的行集实现与连接池一起使用时,有一个神秘的问题会让它变得如此丑陋。似乎存在对缓存的行集对象中保持的连接的静默引用(即使它应该断开连接),这会关闭随后在垃圾收集池中打开的另一个连接。出于这个原因,我最终放弃并编写了自己的数据对象层(这些天我将其交给spring&amp; hibernate)。

答案 5 :(得分:0)

旧线程,但我刚遇到同样的问题,最后得到了一个实用功能:

           RESULT TABLE
 -----------------------------------------
| ReceiptId | JobId |  SK  | Clicks Count |
|-----------|-------|------|--------------|
| 0000001   | 67789 | 4151 |      3       |
|-----------|-------|------|--------------|
| 0000002   | 67789 | 4151 |      2       |
|-----------|-------|------|--------------|
| 0000003   | 67789 | 4151 |      1       |
 -----------------------------------------

如果我们不必在lambda中捕获异常(没有一些丑陋的黑客攻击),这将是非常好的。

答案 6 :(得分:0)

下面是贾里德(Jared)在此主题中的最高答案,以及corsiKa对它的低估评论之一:

ResultSetMetaData meta = crs.getMetaData();
int numCol = meta.getColumnCount();
Set<String> columns = new HashSet<>;

for (int i = 1; i <= numCol; i++) 
{
    columns.add(meta.getColumnName(i));    
}


return columns.contains("name");