Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java未捕获ms sql存储过程引发错误_Java_Sql Server_Stored Procedures_Try Catch_Raiserror - Fatal编程技术网

java未捕获ms sql存储过程引发错误

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

我的SQLServer2008数据库中有一个存储过程,我正在开发一个使用sqljdbc4连接的java应用程序。一切都很好,即使是过程调用,但有一件事——在某些情况下,java不会捕获过程引发的异常,也不会在调用(如select或update(delete insert))时指定

这里有一个例子

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()来迭代结果集,那么根据我的经验,即使您没有“启动”,也会抛出异常。在我看来,对解决方案不计数是有风险的,因为它非常容易出错。