如何从Java中获取T-SQL存储过程的返回值?

时间:2010-11-02 20:42:30

标签: java sql-server-2005 stored-procedures jdbc return-value

我有一个存储过程,它将一个对象添加到数据库并返回生成的ID号。

作为参考,其基本结构如下:

ALTER PROCEDURE [dbo].[myProc] 
    @Name    nvarchar(50),
    @Creator nvarchar(50),
    @Text    nvarchar(200),
    @Lat     float,
    @Lon     float,
    @myID    int OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO myTable --# blah blah blah
    SELECT @myID = scope_identity(); --# grab the auto-inc key from myTable
    INSERT INTO anotherTable --# blah blah blah
END

我在SQL Server Management Studio中运行它并验证它是否正常工作。

现在我想从Java调用该存储过程。我写了这段代码来做到这一点:

CallableStatement cs = con.prepareCall("EXEC myProc "
  + "@Name = ?, @Creator = ?, @Text = ?, @Lat = ?, @Lon = ?, @myID = ? OUTPUT");
cs.setString(1, aString);
cs.setString(2, anotherString);
cs.setString(3, yetAnotherString);
cs.setFloat(4, aFloat);
cs.setFloat(5, anotherFloat);
cs.registerOutParameter(6, java.sql.Types.INTEGER);

cs.execute();

execute()调用抛出异常:

  

java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][SQL Server]Error converting data type nvarchar to int.

这里出了什么问题?为什么它甚至试图将nvarchar转换为int?我甚至没有尝试通过getInt()获取返回值(在下一行中出现)。

我尝试了什么:

  • 通过字符串操作构建查询以检查问题是否可能在输入参数中。同样的例外。至少可以缩小问题范围。
  • 将输出参数的类型更改为Types.NVARCHAR,以防万一。但是我甚至不支持我正在使用的JdbcOdbcDriver。
  • 使用调用语法(我以前没有使用SQL Server和Java)。总是出现语法错误。这包括尝试使myID成为返回值而不是输出参数。
  • 搜索Google。很多。结束了一堆无益的论坛帖子和EE“答案”。

现在我很难过。这真的很难,还是我错过了那个显而易见的?

2 个答案:

答案 0 :(得分:2)

您的代码看起来不错。唯一错误的是SQL Server中的“float”在Java中映射为double。 MS中的“真实”映射到Java中浮动。但这不会产生问题。

问题是错误的ODBC Bridge。您应该为MS SQL使用类型4 JDBC驱动程序。如果要使用ODBC Bridge,则可以测试为第6个参数设置值:

cs.setInt(6, 0);

但我不知道这是否有效。该消息表示驱动程序正在使用数据类型NVARCHAR作为最后一个参数。看起来ODBC Bridge不会使用registerOutParameter转发类型。

答案 1 :(得分:0)

由于我没有SQL Server,因此无法测试您的代码,但您可以尝试更改为String,因为这是与NVARCHAR等效的Java。