java – JDBC调用Microsoft SQL Server存储过程的同义词

使用Microsoft提供的JDBC驱动程序(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)

即使参数设置正确(如果我直接调用过程(绕过同义词),一切正常).

此外,如果我用jtds替换微软的驱动程序,一切正常.

如何使用Microsoft sql Server的JDBC驱动程序使用存储过程的同义词来运行CallableStatement?

解决方法:

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

相关文章

连接数据库的方式:第一种方式:ODBC:开放数据库连接是微软...
JDBCRequest 使用VariableNamesmysql:数据库连接池对象var...
 1.JDBCDBC(JavaDataBaseConnectivity):Java数据库连接技术...
1.需要jar包的支持:java.sqljavax.sqlmysql-conneter-java....
1.简介Activiti是一个业务流程管理(BPM)框架,它是覆盖了业务...
1.JDBC体系系统一组规范:接口JDBC接口(API)包括两个层次:...