我们的问题是当"执行"从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"));
}
}