2

残念ながら、Java を使用して MS SQL Server でいくつかのストアド プロシージャを実行する状況に陥ってしまいました。例外が発生したときに SP で RAISEERROR コマンドを使用しています。問題は、Java がこれらの例外をキャッチできないように見えることです。私のサンプルSP:

ALTER PROCEDURE [dbo].[sp_test] 
    @fname nchar(30),
    @lname nchar(30)
AS
BEGIN

    BEGIN TRY
        IF (@fname) = 'something'
        BEGIN
            RAISERROR (N'First name is not valid!',16,1, N'number', 5);
            RETURN
        END
        Insert into [users] (
            [id]
          ,[fname]
          ,[lname]
          )
       Values
        (
            '1',
            @fname,
            @lname
        )
    END TRY
    BEGIN CATCH

    END CATCH   
END

私のJavaコード:

try {
                // Establish the connection.
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                    con = DriverManager.getConnection(connectionUrl);
                    //------- Call a sp
                    String SPsql="EXEC sp_test ?,?"; //String SPsql="EXEC <sp_test> ?,?";
                    PreparedStatement ps=con.prepareStatement(SPsql);
                    ps.setEscapeProcessing(true);
                    ps.setQueryTimeout(20);
                    ps.setString(1, "something");
                    ps.setString(2, "12346");
                    //ps.setString(parameterIndex, x)
                   ps.execute();

                    }
            }
        catch (SQLException e) {
            e.printStackTrace();
        }catch (Exception e) {
            e.printStackTrace();
        }

SP は正常に実行されますが、Java で例外はキャッチされません。

では、Java はこの種の例外を処理できますか? ここで何か間違ったことをしていますか?

4

2 に答える 2

2

申し訳ありませんが、SPのキャッチ部分を埋めるのを忘れていたので、そこに RAISEERROR を置くと問題が解決しました:

.
.
.
    BEGIN CATCH
        RAISERROR (N'ERROR OCCURED!!! %s %d.', 16, 1, N'number', 5); 
    END CATCH   
于 2012-08-28T06:48:45.717 に答える
2

(固定長文字列)のため、ステートメントRAISERROR ..は実行されません。ncharに変更しnvarcharます。

ALTER PROCEDURE [dbo].[sp_test] 
    @fname nvarchar(30),
    @lname nvarchar(30)
AS
于 2012-08-28T06:39:20.273 に答える