JDBC вызов синонима хранимой процедуры Microsoft SQL Server - PullRequest
4 голосов
/ 14 февраля 2012

Использование драйвера JDBC, предоставленного Microsoft (sqljdbc4.jar) Я не могу вызвать хранимую процедуру, используя определенный для нее синоним. То есть для синонима, определенного как:

CREATE SYNONYM dbo.synonym_name for dbo.procedure_name

при выполнении оператора вызова, созданного:

CallableStatement callStmt = conn.prepareCall("{ call [dbo].[synonym_name] (?,?,?,?,?,?) }");

Я получаю исключение:

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: Parameter param_name was not defined for stored procedure [dbo].[synonym_name].
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)
    at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.findColumn(SQLServerCallableStatement.java:1217)
    at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.setString(SQLServerCallableStatement.java:1563)
    at testmssql.main(testmssql.java:53)

Даже если параметры установлены правильно (если я вызываю процедуру напрямую (в обход синонима), все работает нормально).

Более того, если я заменю драйвер Microsoft на JTDS, все будет нормально.

Как запустить CallableStatement, используя синоним хранимой процедуры с драйвером JDBC для Microsoft SQL Server?

1 Ответ

1 голос
/ 28 июля 2012

Синонимы SQL Server не имеют метаданных с возможностью запроса.Судя по ошибке, JDBC пытается подтвердить, что параметры, объявленные в коде Java, соответствуют параметрам, объявленным в хранимой процедуре.Это не удается из-за отсутствующих метаданных.

Единственный способ обойти это - создать сквозную хранимую процедуру вместо синонима.Поэтому, если у вас есть эта процедура:

CREATE PROCEDURE dbo.RealProcedure
@p1 INT,
@p2 INT
AS
BEGIN
  RAISERROR('TODO: implement me',16,10);
END

И у вас есть этот синоним:

CREATE SYNONYM dbo.myProcedure FOR dbo.realProcedure;

Удалите синоним и создайте эту процедуру вместо:

CREATE PROCEDURE dbo.myProcedure
@p1 INT,
@p2 INT
AS
BEGIN
  EXEC dbo.realProcedure @p1,@p2;
END

Тампохожая проблема, описанная здесь: http://social.msdn.microsoft.com/Forums/en-us/sqldataaccess/thread/dcdfee17-a926-4b57-8641-ed86fec989f2

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