gpt4 book ai didi

java - 使用 CallableStatement.setObject(int,Object) 时出现 SQLServerException?

转载 作者:行者123 更新时间:2023-12-01 05:46:15 26 4
gpt4 key购买 nike

简单问一下,为什么在使用以下代码时会出现以下异常;

请注意,这是使用 Java 通过存储过程调用 MS SQL Server 2008 R2。

Connection con = getDataSource().getConnection();
CallableStatement cs = con.prepareCall("countrySelect(?)");
cs.setObject(1, "GB");
cs.execute();

结果;

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '@P0'.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:390)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:340)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:154)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:322)

这个“@P0”来自哪里?这是Java内存引用吗?为什么它没有正确转换为 SQL 类型?

如果可以的话,我也会得到同样的东西;

cs.setString(1, "GB");

存储的Proc代码如下(不是我写的);

DECLARE @dbid INTEGER;
DECLARE @dbName NVARCHAR(125);
DECLARE @prcName NVARCHAR(125);

SET @dbid = DB_ID();
SET @dbName = DB_NAME();
SET @prcName = 'usp_countrySelect'

IF dbo.ufn_Admin_countryExists(@countryCode) = 1

SELECT countryCode
, countryName
, nationalVerificationPrice
, vatCharged
, VATPercentage
, sortingPrecedence
FROM dbo.country
WHERE countryCode = @countryCode ;

ELSE

RAISERROR ( N'ERROR: A country with countryCode %s does not exist - proc Name:%s, database ID:%i, the database name is: %s.'
, 16 -- Severity
, 1 -- State
, @countryCode -- First subbed argument
, @prcName -- Second subbed argument
, @dbid -- Third subbed argument
, @dbName -- Fourth subbed argument
);

END

最佳答案

弄清楚了,如果你问我的话,这是一个不明显的问题的蹩脚错误;

CallableStatement cs = con.prepareCall("countrySelect(?)");

不起作用,而是使用;

CallableStatement cs = con.prepareCall("{call countrySelect(?)}");

区别在于单词“call”和括起来的 { } 括号。

关于java - 使用 CallableStatement.setObject(int,Object) 时出现 SQLServerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5870787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com