无法执行使用Java和JDBC SQL服务器

问题描述:

上我一直在试图通过今天JDBC执行MS SQL Server存储过程,并已成功迄今存储过程。存储过程有1个输入和1个输出参数。对于在代码中设置存储过程调用时使用的每种组合,我都会收到一条错误消息,指出无法找到存储过程。我提供了我在下面执行的存储过程(注意:这是供应商代码,所以我无法更改它)。无法执行使用Java和JDBC SQL服务器

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对象的代码中,我记录了要连接到的数据库并且代码连接到了正确的数据库。

任何想法?

非常感谢您提前。

+0

我增加了一个额外的场景: CallableStatement的声明= 了Connection.prepareCall( “{?=调用spWCoTaskIdGen()}”); statement.registerOutParameter(1,java.sql.Types.INTEGER); statement.registerOutParameter(2,java.sql.Types.INTEGER); statement.executeQuery(); 上面的代码导致以下错误: 07:50:25,978错误JDBCExceptionReporter:101 - 找不到存储过程'spWCoTaskIdGen'。 – jwmajors81 2009-11-13 13:52:37

+0

这样做效果不好:)我会将示例添加到上面的原始问题。 – jwmajors81 2009-11-13 13:53:15

+0

您使用的是什么JDBC驱动程序? JTDS? – Asaph 2009-11-13 14:37:20

因为它甚至找不到该过程,所以我首先要确保您的用户具有该过程的执行权限。您可以尝试使用像Squirrel这样的工具的相同用户执行proc。

+0

我已经完成了这一步,并提供了原始问题中的结果SQL。感谢您的建议。 – jwmajors81 2009-11-13 14:02:54

+0

松鼠将通过JDBC进行连接,所以如果您尝试通过它来运行它,您可以验证驱动程序/ JDBC连接字符串不是问题。你可以从这里下载它:http://squirrel-sql.sourceforge.net/ – 2009-11-13 20:30:19

+0

如果你不能通过松鼠执行,它可能更多的可能是你的连接字符串,而不是驱动程序。确保它看起来像jdbc:sqlserver:// localhost:1433; databaseName = ADatabase,并且databaseName是正确的名称。 – 2009-11-13 21:01:25

尝试没有dbo.所有者名称:

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

而且,这是一个远射,你确定你的数据库服务器中正确的数据库是?

+0

我试过这个并收到相同的错误信息。该例已被添加到原始问题中。谢谢。 – jwmajors81 2009-11-13 14:02:13

的最有可能的一个...

  1. 凭证用途没有权限运行代码。您需要上述脚本中的GRANT EXECUTE

  2. 数据库错误。例如,存储过程在主创建,但您连接到“MYDB”

+0

我已确认该用户具有授予权限并且已连接到正确的数据库。不过谢谢你的建议。 – jwmajors81 2009-11-13 14:01:19

你有没有试图改变你的Java代码中使用“执行”,而不是“呼”? 那就是:

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