java – JDBC调用Microsoft SQL Server存储过程的同义词
发布时间:2020-12-15 02:31:41 所属栏目:Java 来源:网络整理
导读:使用Microsoft提供的JDBC驱动程序(sqljdbc4.jar)我无法使用为其定义的同义词调用存储过程. 即对于定义为的同义词: CREATE SYNONYM dbo.synonym_name for dbo.procedure_name 当运行由以下创建的可调用语句时: CallableStatement callStmt = conn.prepareCa
使用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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |