簡體   English   中英

無法在 SQL 服務器上使用 Java 和 JDBC 執行存儲過程

[英]Unable to execute stored Procedure using Java and JDBC on SQL server

我今天一直在嘗試通過 JDBC 執行 MS SQL 服務器存儲過程,但到目前為止一直沒有成功。 存儲過程有 1 個輸入和 1 個 output 參數。 在代碼中設置存儲過程調用時,我使用的每種組合都會出現錯誤,指出無法找到存儲過程。 我在下面提供了我正在執行的存儲過程(注意:這是供應商代碼,所以我無法更改它)。

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. 在創建連接 object 的代碼中,我記錄了我正在連接的數據庫,並且代碼正在連接到正確的數據庫。

有任何想法嗎?

非常感謝您提前。

最有可能...

  1. 憑據使用無權運行代碼。 您需要在上面的腳本中GRANT EXECUTE

  2. 錯誤的數據庫。 例如,存儲的proc是在master中創建的,但是您已連接到“ MyDB”

由於它甚至找不到該過程,因此我首先要確保您的用戶具有該過程的執行特權。 您可以嘗試從同一個用戶(如Squirrel)執行proc。

不使用dbo.嘗試一下dbo. 所有者名稱:

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

另外,這是一個遠景,您確定您在數據庫服務器中的正確數據庫中嗎?

我在使用 SQLServer 2012 Express 時遇到了同樣的問題。 我解決了它啟動“SQL Server Browser”服務。

您是否嘗試過將Java代碼更改為使用“ exec”而不是“ call”? 那是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM