Pergunta

Eu estou consultando dados de pontos de vista que estão sujeitas a mudanças. Eu preciso saber se existe a coluna antes de eu fazer um crs.get******().I descobriram que eu posso consultar os metadados como este para ver se a exist coluna antes de solicitar os dados a partir dele.

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

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

Existe uma maneira mais simples de verificar para ver se existe uma coluna?

EDIT: Deve ser agnóstico banco de dados. É por isso que eu estou fazendo referência a CachedRowSet em vez do banco de dados.

Foi útil?

Solução

Não há uma maneira mais simples com a API geral JDBC (pelo menos não que eu saiba, ou pode encontrar ... Eu tenho exatamente o mesmo código no meu conjunto de ferramentas home-grown.)

(Seu código não é completa):

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;

Dito isto, se você usar proprietária, consultas específicas de banco de dados da API e / ou SQL, eu tenho certeza que você pode encontrar maneiras mais elegantes de fazer a mesma coisa ... mas você teria de código personalizado de gravação para cada banco de dados que você precisa para lidar com eles. Eu ia ficar com o APIs JDBC, se eu fosse você.

Existe algo sobre a sua proposta de solução que faz você pensar que é incorreta? Parece bastante simples para mim ...

Outras dicas

você poderia tomar o caminho mais curto de usar o fato de que findColumn () lançará uma SQLException para InvalidColumName se a coluna não está na CachedRowSet.

Por exemplo

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

Provavelmente um abuso de Tratamento de excepções (por EffectiveJava produto 2a ed 57) mas é uma alternativa para um ciclo através de todas as colunas de dados meta.

qual banco de dados?

Eu acho que no Oracle há mesas onde as colunas estão listados.

Eu não me lembro se ele trabalhar para vistas também, mas eu acho que eles fazem, que era algo como:

select colum_name from all_views where view_name like 'myview'

ou

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

Eu não me lembro exatamente a sintaxe. Você deve ter permissões espaciais embora.

Cada RDBMS deve ter algo semelhante.

Você também pode executar a consulta

select * from myView where 1 = 0 ; 

E a partir dos metadados obter as colunas, se o que você quer para evitar a buscar os dados antes de saber se as colunas estão presentes.

Não, não há realmente uma maneira melhor. Você pode querer relook no problema. Se você pode redefinir o problema, às vezes, faz com que a solução mais simples porque o problema mudou.

AVISO: seguinte comentário puramente de memória sem qualquer papelada apoio:)

Se bem me lembro há um problema misterioso que eleva sua sempre tão feio-cabeça quando a implementação do conjunto de linhas oráculo em cache é usado com o pool de conexão. Parece haver uma referência silenciosa para a ligação realizada dentro do objeto conjunto de linhas em cache (mesmo que é suposto ser desconectado) que fecha outra conexão posteriormente aberta a partir de piscina na coleta de lixo. Por esta razão, eu finalmente desistiu e escreveu minha própria camada de objeto de dados (estes dias eu entregar que, ao longo de primavera e de hibernação).

discussão antiga, mas eu só enfrentou o mesmo problema e acabou com uma função de utilidade:

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());
}

Ele estaria bastante ELEGENT se não teria que capturar exceções dentro de um lambda (sem alguns hacks feios)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top