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

Java 返回没有结果集的存储过程时EclipseLink SQLServerException,java,sql,sql-server,eclipselink,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.

我正在使用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));
如果没有返回结果集,我必须如何避免异常?

尝试捕获

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
}
列出记录;
试一试{
List records=(List)jpaem.getActiveSession().executeQuery(查询,数组,asList(part,productNr,lang));
}捕获(DatabaseException-ex){
记录=新的ArrayList();
return records;//返回空列表,也可以处理自己的异常
}
它是一个特定的驱动程序异常,因此您必须自己处理它(它不是常见的空结果集)


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

尝试捕获听起来很熟悉吗?谢谢您的回答。是的,我可以使用try/catch,但它似乎更像是一种变通方法,而不是解决方案。我想避免抛出异常。我刚刚读了你的最后一句话。你说这是sqljdbc4驱动程序的预期行为?啊!是的,完全错过了。如果查询不执行SELECT操作,但执行INSERT、UPDATE或DELETE操作,则使用executUpdate而不是executeQuery。通过使用executeUpdate,可以防止驱动程序异常。不,我不需要executeUpdate,因为这不是DML操作。SP获取数据(如果可用)并返回数据。
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
}