SQLServerException при использовании CallableStatement.setObject (int, Object)? - PullRequest
1 голос
/ 03 мая 2011

Быстрый вопрос, почему я получаю приведенное ниже исключение при использовании следующего кода:

Обратите внимание, что для вызова MS SQL Server 2008 R2 с использованием хранимых процедур используются Java.

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

1 Ответ

0 голосов
/ 04 мая 2011

Разобрался, довольно грубая ошибка, если вы спросите меня;

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

НЕ работает, вместо этого используйте;

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

Разница в слове"вызов" и заключенные в скобки {}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...