2009-12-01 3 views
7

Sto utilizzando la versione sqljdbc4.jar (sqljdbc_2.0).SQLServerException: l'istruzione non ha restituito un set di risultati durante l'esecuzione di SQL

Sto eseguendo un a selezionare di nuovo inserto + per ottenere l'identità in questo modo:

BEGIN 
INSERT INTO DateRangeOptions (Description,Code) 
VALUES ('dateRange.quickPick.option.all','ALL'); 
SELECT SCOPE_IDENTITY() 
END 

e ottengo:

 
com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set. 

La linea è:

st.executeQuery(updateQuery) 

Qualche idea?

+0

Non tutti i driver consentono l'esecuzione di blocchi di istruzioni come una query. Se questo funziona in uno e non in un altro è il probabile colpevole. – Donnie

+0

che non sarebbe molto prudente con Microsoft donnie, un select scope_identity() DEVE verificarsi prima di ogni altro inserto e su una connessione con lo stesso ID di lavoro. Ovviamente è possibile eseguire le query back to back, ma limita il modo in cui una connessione aperta può essere utilizzata dalle applicazioni. Anche il server SQL non ha problemi nell'esecuzione di più query e il driver non è a conoscenza di T-SQL, quindi non ha idea di cosa sta eseguendo. - Vainstah 0 sec fa –

risposta

8

Aggiornato da SQL 2000 a SQL 2005 e passato a Microsoft SQL Server 2005 JDBC Driver versione 1.2. Ho ricevuto l'errore "L'istruzione non ha restituito un risultato" durante l'esecuzione di un Insert seguito da SELECT SCOPE_IDENTITY() ". Ho risolto il problema utilizzando executeUpdate() e getGeneratedKeys invece di executeQuery. Ecco il codice prima e dopo.

Nota: la connessione utilizzata in questo esempio è java.sql.Connection non il com.microsoft.sqlserver.jdbc.SqlServerConnection

SQL 2000 codice

String dbURL = "jdbc:sqlserver" + "://" + dbServer + ":" + 
       dbServerPort + ";SelectedMethod=cursor;databaseName=" 
          + dbName + ";user=xxx;password=xxx"; 
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
java.sql.Connection connection = DriverManager.getConnection(dbURL); 
sql = "insert into Contact (name) values ('ABC'); SELECT SCOPE_IDENTITY()"; 
PreparedStatement ps = connection.prepareStatement(sql); 
ResultSet rs = ps.executeQuery(); 
if (rs.next()) { 
    long id = rs.getLong(1); 
    System.out.println("Id=" + id); 
} 

SQL 2005. codice

String dbURL = "jdbc:sqlserver" + "://" + dbServer + ":" + 
       dbServerPort + ";SelectedMethod=cursor;databaseName=" 
          + dbName + ";user=xxx;password=xxx"; 

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
java.sql.Connection connection = DriverManager.getConnection(dbURL); 
sql = "insert into Contact (name) values ('ABC'); SELECT SCOPE_IDENTITY()"; 
PreparedStatement ps = connection.prepareStatement(sql); 
ps.executeUpdate(); // do not use execute() here otherwise you may get the error 
        // The statement must be executed before 
        // any results can be obtained on the next 
        // getGeneratedKeys statement. 

ResultSet rs = ps.getGeneratedKeys(); 
if (rs.next()) { 
    long id = rs.getLong(1); 
    System.out.println("Id=" + id); 
} 
+0

Grazie per questo, questo è davvero bizzarro, e ha poco senso. Devo cercare perché funziona. –

1

La riga inserita non è riuscita quindi non c'è identità? imposta una query di breakpoint viene generata in Java copia la stringa di query ed eseguila in Management Studio per vedere qual è il risultato. Questo potrebbe mostrarti cosa stai sbagliando.

+0

Nessun inserto funziona correttamente nell'analizzatore di query. – sproketboy

+0

strano, se la query è sintatticamente corretta non dovrebbe causare problemi. I driver sono intercambiabili? Il driver microsoft - potrebbe richiedere diverse chiamate di funzioni di inizializzazione. Questo è certamente il caso con diversi driver ODBC. Hai cambiato il catalogo corretto? –