java未捕获ms sql存储过程引发错误
我的SQLServer2008数据库中有一个存储过程,我正在开发一个使用sqljdbc4连接的java应用程序。一切都很好,即使是过程调用,但有一件事——在某些情况下,java不会捕获过程引发的异常,也不会在调用(如select或update(delete insert))时指定 这里有一个例子java未捕获ms sql存储过程引发错误,java,sql-server,stored-procedures,try-catch,raiserror,Java,Sql Server,Stored Procedures,Try Catch,Raiserror,我的SQLServer2008数据库中有一个存储过程,我正在开发一个使用sqljdbc4连接的java应用程序。一切都很好,即使是过程调用,但有一件事——在某些情况下,java不会捕获过程引发的异常,也不会在调用(如select或update(delete insert))时指定 这里有一个例子 AS BEGIN DECLARE @c INT SELECT @c= COUNT(nomUtilisateur) FROM Utilisateur2 PRINT
AS
BEGIN
DECLARE @c INT
SELECT @c= COUNT(nomUtilisateur)
FROM Utilisateur2
PRINT @c
RAISERROR(N'error message personalise',18,1)
END
在本例中,java捕获异常
try{
CallableStatement cll=con.prepareCall("EXEC f3 ");
cll.execute();
System.out.println("fin EXEC f3 ? ");}
catch (SQLException e) {
System.out.println("sqlerror state: "+e.getSQLState() +" |error code: "
+ e.getErrorCode()+" |message: "+e.getMessage());
e.printStackTrace();
}
但是当我使用像这样的选择
ALTER PROCEDURE [dbo].[f3]
AS
BEGIN
declare @c INT
SELECT @c= COUNT(nomUtilisateur)
FROM Utilisateur2
select * from Utilisateur2
PRINT @c
RAISERROR(N'error message personalise',18,1)
END
更改过程[dbo]。[f3]
作为
开始
声明@c INT
选择@c=COUNT(nomultisateur)
从利用率2
从UsilizateUr2中选择*
打印@c
RAISERROR(N'error message personalise',18,1)
结束
或者更新,java继续执行而不捕获异常。这就好像它不等待程序的结束
所以我的问题是,我是否错误地使用了存储过程,或者它是jdbc驱动程序中的一个bug,或者它更喜欢使用out参数并保留此策略;我用谷歌搜索了这个问题,什么也没找到
就我个人而言,我想使用引发的错误尝试删除PRINT语句,并在proc的代码中添加“SET NOCOUNT ON”,这可能是因为驱动程序被搞糊涂了。这一行是什么:
**select*from usilizateur2**
应该是什么意思?它不是有效的SQL语法AFAIK,我无法在我的任何SQL服务器中编译此过程。这纯粹是猜测,但java是否解释存储过程的返回值?如果在raiserror后加上“return 1”怎么办?非常感谢match i wos loking为禁用请求完成的默认打印所做的一些事情and@Lion不幸的是,该网站每月只允许更改一次名称。但我要说的是,如果您通过调用结果集上的getResultSet()和next()来迭代结果集,那么根据我的经验,即使您没有“启动”,也会抛出异常。在我看来,对解决方案不计数是有风险的,因为它非常容易出错。