2009-12-01 5 views
7

sqljdbc4.jar (sqljdbc_2.0) 버전을 사용하여 사용하고 있습니다. 나는이 같은 정체성을 얻기 위해 삽입 + 선별 등을 실행하고 있습니다SQLServerException : SQL을 실행할 때 문이 결과 집합을 반환하지 않았습니다.

:

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

를 내가 얻을 :

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

라인은 다음과 같습니다

st.executeQuery(updateQuery) 

어떤 아이디어?

+0

모든 드라이버가 명령문 블록을 하나의 쿼리로 실행할 수있는 것은 아닙니다. 이것이 가능성있는 범죄자가 아닌 다른 사람에게는 효과가 있다면. – Donnie

+0

은 마이크로 소프트의 돈을 신중히 생각하지 않을 것입니다. select_scope_identity()는 다른 삽입보다 먼저 일어나야하고 동일한 작업 ID로 연결해야합니다. 물론 쿼리를 다시 수행 할 수는 있지만 응용 프로그램이 열린 연결을 사용하는 방법을 제한합니다. 또한 SQL 서버는 다중 쿼리를 실행할 때 아무런 문제가 없으며 드라이버는 T-SQL을 인식하지 못하기 때문에 실행중인 실마리가 없습니다. - Vainstah 0 초 전 –

답변

8

SQL 2000에서 SQL 2005로 업그레이드되고 Microsoft SQL Server 2005 JDBC 드라이버 버전 1.2로 전환되었습니다. "Insert 문을 SELECT SCOPE_IDENTITY()로 실행할 때 구문이 결과를 반환하지 않습니다"라는 오류가 발생했습니다. executeUpdate() 및 getGeneratedKeys 대신 executeQuery를 사용하여 문제를 해결했습니다. 앞뒤의 코드는

입니다.

참고 :이 예에서 사용 된 연결은 java.sql.Connection에하지 com.microsoft.sqlserver.jdbc.SqlServerConnection 코드

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 SQL 2000

. 코드

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

이것에 감사드립니다, 이것은 정말로 기괴하며, 거의 이해가되지 않습니다. 나는 이것이 왜 효과가 있는지 연구 할 필요가있다. –

1

삽입 한 행이 실패 했으므로 신원이 없습니다? 중단 점 쿼리를 설정 자바에서 생성 된 쿼리 문자열을 복사하고 관리 스튜디오에서 결과를보고 실행합니다. 이것은 당신이 잘못하고있는 것을 보여줄 것입니다.

+0

쿼리 분석기에서 제대로 삽입되지 않습니다. – sproketboy

+0

ery odd, 쿼리가 구문 적으로 정확하다면 문제가 발생하지 않습니다. 드라이버는 플러그 스왑이 가능합니까? microsoft 드라이버 - 다른 초기화 함수 호출이 필요할 수 있습니다. 이것은 확실히 다른 ODBC 드라이버의 경우입니다. 올바른 카탈로그로 변경 했습니까? –

관련 문제