无法在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’。
最后,我还应该指出以下几点:
-
我使用了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
-
正在执行的代码使用与上面第1点中使用的用户ID相同的用户ID运行。
- 在创建Connection对象的代码中,我记录了我正在连接的数据库,并且代码连接到正确的数据库。
有任何想法吗?
非常感谢你提前。
最有可能的……
-
凭据使用没有权限运行代码。 您需要在上面的脚本中使用
GRANT EXECUTE
-
错误的数据库。 例如,存储过程是在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(?)}");