无法在SQL Server上使用Java和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(); 

我收到以下错误:严重:找不到存储过程’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相同的用户ID运行。

  3. 在创建Connection对象的代码中,我记录了我正在连接的数据库,并且代码连接到正确的数据库。

有任何想法吗?

非常感谢你提前。

最有可能的……

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

  2. 错误的数据库。 例如,存储过程是在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(); 

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

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

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