无法执行使用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”。
最后,我还要指出以下几点:
-
我已经使用了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来执行运行。
- 在创建Connection对象的代码中,我记录了要连接到的数据库并且代码连接到了正确的数据库。
任何想法?
非常感谢您提前。
因为它甚至找不到该过程,所以我首先要确保您的用户具有该过程的执行权限。您可以尝试使用像Squirrel这样的工具的相同用户执行proc。
我已经完成了这一步,并提供了原始问题中的结果SQL。感谢您的建议。 – jwmajors81 2009-11-13 14:02:54
松鼠将通过JDBC进行连接,所以如果您尝试通过它来运行它,您可以验证驱动程序/ JDBC连接字符串不是问题。你可以从这里下载它:http://squirrel-sql.sourceforge.net/ – 2009-11-13 20:30:19
如果你不能通过松鼠执行,它可能更多的可能是你的连接字符串,而不是驱动程序。确保它看起来像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();
而且,这是一个远射,你确定你的数据库服务器中正确的数据库是?
我试过这个并收到相同的错误信息。该例已被添加到原始问题中。谢谢。 – jwmajors81 2009-11-13 14:02:13
的最有可能的一个...
凭证用途没有权限运行代码。您需要上述脚本中的
GRANT EXECUTE
数据库错误。例如,存储过程在主创建,但您连接到“MYDB”
我已确认该用户具有授予权限并且已连接到正确的数据库。不过谢谢你的建议。 – jwmajors81 2009-11-13 14:01:19
你有没有试图改变你的Java代码中使用“执行”,而不是“呼”? 那就是:
CallableStatement statement = connection
.prepareCall("{exec dbo.spWCoTaskIdGen(?)}");
我增加了一个额外的场景: 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
这样做效果不好:)我会将示例添加到上面的原始问题。 – jwmajors81 2009-11-13 13:53:15
您使用的是什么JDBC驱动程序? JTDS? – Asaph 2009-11-13 14:37:20