Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Eseguire sp_msforeachdb in un'applicazione Java

Se un'istruzione può restituire no o più risultati, non dovresti usare executeQuery , ma execute() invece, questo metodo restituisce un boolean indicando il tipo del primo risultato:

  • true :il risultato è un ResultSet
  • false :il risultato è un conteggio degli aggiornamenti

Se il risultato è true , quindi usi getResultSet() per recuperare il ResultSet , altrimenti getUpdateCount() per recuperare il conteggio degli aggiornamenti. Se il conteggio degli aggiornamenti è -1 significa che non ci sono più risultati. Nota che anche il conteggio degli aggiornamenti sarà -1 quando il risultato corrente è un ResultSet . È anche bene sapere che getResultSet() dovrebbe restituire null se non ci sono più risultati o se il risultato è un conteggio degli aggiornamenti.

Ora, se vuoi recuperare più risultati, chiama getMoreResults() (o suo fratello che accetta un int parametro). Il valore di ritorno di boolean ha lo stesso significato di execute() , quindi false non significa che non ci siano più risultati!

Non ci sono più risultati solo se getMoreResults() restituisce false e getUpdateCount() restituisce -1 (come documentato anche nel Javadoc)

In sostanza questo significa che se vuoi elaborare correttamente tutti i risultati devi fare qualcosa come di seguito:

boolean result = stmt.execute(...);
while(true)
    if (result) {
        ResultSet rs = stmt.getResultSet();
        // Do something with resultset ...
    } else {
        int updateCount = stmt.getUpdateCount();
        if (updateCount == -1) {
            // no more results
            break;
        }
        // Do something with update count ...
    }
    result = stmt.getMoreResults();
}

NOTA:parte di questa risposta si basa sulla mia risposta a Java SQL:Statement.hasResultSet()?