无法在SQL Server上使用Java和JDBC执行存储过程

时间:2009-11-13 03:23:08

标签: java sql-server stored-procedures jdbc

我一直在尝试通过JDBC执行MS SQL Server存储过程,到目前为止一直没有成功。存储过程有1个输入和1个输出参数。我在代码中设置存储过程调用时使用的每个组合都会收到一条错误,指出无法找到存储过程。我已经提供了我正在执行的存储过程(注意:这是供应商代码,所以我无法更改它。)

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO


ALTER PROC [dbo].[spWCoTaskIdGen] 
@OutIdentifier int OUTPUT
AS

BEGIN
DECLARE @HoldPolicyId int
DECLARE @PolicyId char(14)

IF NOT EXISTS
(
SELECT *
FROM UniqueIdentifierGen (UPDLOCK)
)
INSERT INTO UniqueIdentifierGen VALUES (0)

UPDATE UniqueIdentifierGen 
SET 
    CurIdentifier = CurIdentifier + 1

SELECT @OutIdentifier = 
    (SELECT CurIdentifier
    FROM UniqueIdentifierGen)
END

代码如下:

 CallableStatement statement = connection
            .prepareCall("{call dbo.spWCoTaskIdGen(?)}");
    statement.setInt(1, 0);
    ResultSet result = statement.executeQuery();

我收到以下错误:SEVERE:找不到存储过程'dbo.spWCoTaskIdGen'。

我也试过

    CallableStatement statement = connection
            .prepareCall("{? = call dbo.spWCoTaskIdGen(?)}");
    statement.registerOutParameter(1, java.sql.Types.INTEGER);
    statement.registerOutParameter(2, java.sql.Types.INTEGER);
    statement.executeQuery();

上述结果为:严重:无法找到存储过程'dbo.spWCoTaskIdGen'。

我也尝试过:

    CallableStatement statement = connection
            .prepareCall("{? = call spWCoTaskIdGen(?)}");
    statement.registerOutParameter(1, java.sql.Types.INTEGER);
    statement.registerOutParameter(2, java.sql.Types.INTEGER);
    statement.executeQuery();

上面的代码导致以下错误:无法找到存储过程'spWCoTaskIdGen'。

最后,我还应该指出以下内容:

  1. 我使用过MS SQL Server Management Studio工具,并且能够成功运行存储过程。下面提供了为执行存储过程而生成的sql:

    GO
    DECLARE @return_value int;
    DECLARE @OutIdentifier int;
    EXEC @return_value = [dbo].[spWCoTaskIdGen] @OutIdentifier = @OutIdentifier OUTPUT;
    SELECT
        @OutIdentifier [@OutIdentifier],
        @return_value [Return Value];
    GO
    
  2. 正在执行的代码使用上面第1点中使用的相同用户ID运行。

  3. 在创建Connection对象的代码中,我记录了我正在连接的数据库,并且代码正在连接到正确的数据库。
  4. 有什么想法吗?

    非常感谢你。

4 个答案:

答案 0 :(得分:1)

最有可能是......

  1. 凭据使用无权运行代码。您需要在上面的脚本中使用GRANT EXECUTE

  2. 数据库错误。例如,存储过程是在master中创建的,但您已连接到“MyDB”

答案 1 :(得分:0)

由于它甚至找不到程序,我首先要确保您的用户具有该程序的执行权限。您可以尝试使用Squirrel等工具从同一用户执行proc。

答案 2 :(得分:0)

在没有dbo.所有者名称的情况下尝试:

CallableStatement statement = connection.prepareCall("? = spWCoTaskIdGen(?)");
statement.registerOutParameter(1, java.sql.Types.INTEGER);
statement.registerOutParameter(2, java.sql.Types.INTEGER);
statement.executeQuery();

另外,这是一个远景,你确定你在数据库服务器中的正确数据库中吗?

答案 3 :(得分:-1)

您是否尝试过更改Java代码以使用“exec”而不是“call”? 那就是:

CallableStatement statement = connection
                    .prepareCall("{exec dbo.spWCoTaskIdGen(?)}");