繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM