【问题标题】:Unable to execute stored Procedure using Java and JDBC on SQL server无法在 SQL Server 上使用 Java 和 JDBC 执行存储过程
【发布时间】:2010-12-16 03:56:16
【问题描述】:

我今天一直在尝试通过 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();

我收到以下错误:严重:找不到存储过程 '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 对象的代码中,我记录了我正在连接的数据库,并且代码正在连接到正确的数据库。

有什么想法吗?

非常感谢您。

【问题讨论】:

  • 我添加了一个额外的场景:CallableStatement statement = connection.prepareCall("{? = call spWCoTaskIdGen(?)}"); statement.registerOutParameter(1, java.sql.Types.INTEGER); statement.registerOutParameter(2, java.sql.Types.INTEGER); statement.executeQuery();上面的代码导致以下错误:07:50:25,978 ERROR JDBCExceptionReporter:101 - 找不到存储过程“spWCoTaskIdGen”。
  • 效果不太好 :) 我会将示例添加到上面的原始问题中。
  • 您使用的是什么 JDBC 驱动程序? JTDS?

标签: java sql-server stored-procedures jdbc


【解决方案1】:

很可能是……

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

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

【讨论】:

  • 我已确认该用户确实具有授予权限并且我已连接到正确的数据库。不过还是谢谢你的建议。
【解决方案2】:

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

【讨论】:

  • 我已经这样做了,并在原始问题中提供了生成的 SQL。谢谢你的建议。
  • Squirrel 将通过 JDBC 连接,因此如果您尝试通过它运行它,您可以验证驱动程序/JDBC 连接字符串没有问题。您可以从这里下载:squirrel-sql.sourceforge.net
  • 如果你不能通过 Squirrel 执行,很可能是你的连接字符串而不是驱动。确保它看起来像 jdbc:sqlserver://localhost:1433;databaseName=ADatabase 并且 databaseName 是正确的名称。
【解决方案3】:

尝试不使用 dbo. 所有者名称:

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

另外,这是一个长镜头,您确定您在数据库服务器中的正确数据库中吗?

【讨论】:

  • 我已经试过这个并且收到了同样的错误信息。该示例已添加到原始问题中。谢谢。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 1970-01-01
    • 2012-12-29
    • 2016-10-21
    • 2023-03-15
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多