我正在使用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
如果没有返回结果集,我该怎么办才能避免异常?
答案 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
,从而防止驱动程序异常。