返回没有结果集的存储过程时的EclipseLink SQLServerException

时间:2014-07-01 11:32:12

标签: java sql sql-server eclipselink

我正在使用EclipseLink 2.4.2来调用SQL Server数据库中的存储过程。存储过程是遗留代码,我没有任何见解。

StoredProcedureCall call = new StoredProcedureCall();
call.setProcedureName("p_get_sales");
call.addNamedArgument("p_part", "part")
call.addNamedArgument("p_product_nr", "productNr")
call.addNamedArgument("p_lang", "lang")

DataReadQuery query = new DataReadQuery(call);
query.addArgument("part")
query.addArgument("productNr")
query.addArgument("lang");

JpaEntityManager jpaem = em.unwrap(JpaEntityManager.class);
List<ArrayRecord> records = (List<ArrayRecord>) jpaem.getActiveSession().executeQuery(query, Arrays.asList(part, productNr, lang));

如果数据可用,则一切正常,以便过程返回结果集。有时,数据库中不存在任何要返回的数据。在这种情况下,我得到以下异常:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.
Error Code: 0
Call: EXECUTE p_get_sales @p_part = ?, @p_product_nr = ?, @p_lang = ?
    bind => [Total, 5, de]
Query: DataReadQuery()
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:646)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:537)
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1805)
    at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:566)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:264)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelect(DatasourceCallQueryMechanism.java:246)
    at org.eclipse.persistence.queries.DataReadQuery.executeNonCursor(DataReadQuery.java:197)
    at org.eclipse.persistence.queries.DataReadQuery.executeDatabaseQuery(DataReadQuery.java:152)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:852)
    at org.eclipse.persistence.queries.DataReadQuery.execute(DataReadQuery.java:137)
    at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:751)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2879)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1607)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1589)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1554)
    Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:408)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:285)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:938)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:609)
    ... 47 more

如果没有返回结果集,我该怎么办才能避免异常?

1 个答案:

答案 0 :(得分:0)

尝试抓住?

List<ArrayRecord> records;
try{
List<ArrayRecord> records = (List<ArrayRecord>) jpaem.getActiveSession().executeQuery(query, Arrays.asList(part, productNr, lang));
}catch(DatabaseException ex){
 records = new ArrayList<ArrayRecord>();
return records; //RETURN EMPTY LIST, OR YOU CAN HANDLE YOUR OWN EXCEPTION
}

这是一个特定的驱动程序Exception,所以你必须自己处理它(它不是一个常见的空结果集)。

如果查询未执行SELECT操作,但执行INSERT,UPDATE或DELETE操作,则使用executUpdate而不是executeQuery,从而防止驱动程序异常。