sqljdbc4驱动程序不从SQL Server 2012的前一个插入返回resultSet

时间:2014-07-30 14:27:31

标签: jdbc sql-server-2012 spring-jdbc

我们的问题是当"执行"从Spring-jdbc(来自SqlQuery类)调用方法,该方法返回List中的行集,不返回resultSet并抛出异常。但是,插入发生得很好。我们发现当我们使用Merlia驱动程序(一个旧的驱动程序,甚至是旧的驱动程序)时,它可以与SQL 2012一起使用。我相信我已经配置了错误的东西,因为sqljdbc4.jar驱动程序不能与SQL Server 2012一起使用,但适用于SQL Server 2008。
我们看到的堆栈跟踪是:

com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.
com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:408)
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:285)
org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:648)
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:591)
org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:641)
org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666)
org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:698)
org.springframework.jdbc.object.SqlQuery.execute(SqlQuery.java:112)
org.springframework.jdbc.object.SqlQuery.execute(SqlQuery.java:122)
ident.shared.dao.DAO.create(DAO.java:135)
ident.shared.business.BaseBusiness.create(BaseBusiness.java:57)
org.apache.jsp.add_005fnew_005fuser_jsp._jspService(add_005fnew_005fuser_jsp.java:538)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

顺便说一下,我确实尝试将spring-jdbc jar更新到至少3.1.4而没有运气。

我们与SQl服务器2012建立了JNDI连接。这是context.xml中的部分。

 <Resource name="jdbc/Ident" auth="Container"
      type="javax.sql.DataSource"
      factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
      username="*****" password="*****"
      driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
      url="jdbc:sqlserver://*******\dev;databaseName=ident" 
      maxActive="50"
      maxIdle="10">
</Resource>

以下是应用程序的web.xml的连接部分。

<resource-ref>
    <res-ref-name>jdbc/Ident</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

这是一种允许您建立连接的方法。

public Connection getConnection() {
    Connection conn = null;
    try {
        Context context = new InitialContext();
        Context extContext = (Context) context.lookup("java:/comp/env");
        DataSource dataSource = (DataSource) extContext.lookup("jdbc/Ident");
        conn = dataSource.getConnection();
    } catch (NamingException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        System.out.println("Connection was unable to be established.");
    }
    return conn;
}

以下是插入并调用&#34;执行&#34;的代码。 spring-jdbc的方法。顺便说一下,IdQuery扩展了&#34; MappingSqlQuery&#34;,它扩展了org.springframework.jdbc.object.MappingSqlQueryWithParameters,后者又扩展了SqlQuery,它定义了&#34; execute&#34; IdQuery对象调用的方法。

public DataObject create(DataObject data)
{       

    IdQuery idq = new IdQuery(dataSource, this);
    List idList = idq.execute(this.getCreateParameters(data));
    if (idList != null && idList.size() > 0 && !idList.get(0).equals(new Integer(0))) {
        data.setId((Integer)idList.get(0));
    }

    return data;
}

这是IdQuery的构造函数,如果有帮助的话。

class IdQuery extends MappingSqlQuery {

    IdQuery(DataSource ds, DAO dao) {
        super(ds,"somesql");
        dao.prepareCreate(this);
        super.setSql(this.getSql() + " SELECT SCOPE_IDENTITY() as ID");
        compile();
    }

    protected Object mapRow(ResultSet rs, int rowNum) throws SQLException {
        return (rs.getInt("ID"));
    }

}

0 个答案:

没有答案