我有一个存储过程,它将一个对象添加到数据库并返回生成的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。现在我很难过。这真的很难,还是我错过了那个显而易见的?
答案 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。