2009-12-01 4 views
7

Ich verwende die Version sqljdbc4.jar (sqljdbc_2.0).SQLServerException: Die Anweisung gab kein Ergebnis zurück, wenn SQL ausgeführt wurde

ich einen Einsatz bin Ausführung + eine ausgewählte zurück, um die Identität wie folgt zu erhalten:

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

und ich bekomme:

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

Die Linie ist:

st.executeQuery(updateQuery) 

Irgendwelche Ideen?

+0

Nicht alle Treiber erlauben Anweisungsblöcke, die als eine Abfrage ausgeführt werden. Wenn das in einem und nicht in einem anderen funktioniert, ist das wahrscheinlich der Schuldige. – Donnie

+0

das wäre nicht sehr vorsichtig von Microsoft Donnie, ein ausgewählter scope_identity() muss vor allen anderen Einfügungen und auf einer Verbindung mit der gleichen Job-ID geschehen. Sie können die Abfragen natürlich nacheinander ausführen, aber sie beschränken, wie eine offene Verbindung von Anwendungen verwendet werden kann. Auch SQL Server hat kein Problem, mehrere Abfragen auszuführen, und der Treiber ist nicht T-SQL-fähig, so dass er keine Ahnung hat, was er ausführt. - Vainstah 0 secs ago –

Antwort

8

Upgrade von SQL 2000 auf SQL 2005 und Umstellung auf Microsoft SQL Server 2005 JDBC-Treiber Version 1.2. Ich habe den Fehler "Die Anweisung hat kein Ergebnis zurückgegeben" beim Ausführen eines Einfügens gefolgt von SELECT SCOPE_IDENTITY() ". Ich löste das Problem mit ExecuteUpdate() und getGeneratedKeys anstelle von executeQuery. Hier ist die Vorher-und Nachher-Code.

Hinweis: die Verbindung in diesem Beispiel verwendet wird, ist java.sql.Connection nicht die com.microsoft.sqlserver.jdbc.SqlServerConnection

SQL 2000 Code

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. Code

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

Danke dafür, das ist wirklich bizarr und macht wenig Sinn. Ich muss herausfinden, warum das funktioniert. –

1

Die Zeile, die Sie eingefügt haben, fehlgeschlagen, daher gibt es keine Identität? Legen Sie eine Haltepunktabfrage fest, die in Java generiert wird, kopieren Sie die Abfragezeichenfolge und führen Sie sie im Verwaltungsstudio aus, um zu sehen, was das Ergebnis ist. Dies könnte Ihnen zeigen, was Sie falsch machen.

+0

Nein, die Einfügung funktioniert gut im Query Analyzer. – sproketboy

+0

Er ist ungerade, wenn die Abfrage syntaktisch korrekt ist, sollte es kein Problem verursachen. Sind die Treiber plug-swappable? Der Microsoft-Treiber benötigt möglicherweise andere Initialisierungsfunktionsaufrufe. Dies ist sicherlich bei verschiedenen ODBC-Treibern der Fall. Haben Sie den richtigen Katalog gewählt? –

Verwandte Themen