使用Microsoft提供的JDBC驱动程序(sqljdbc4.jar)我无法使用为其定义的同义词调用存储过程.即对于定义为的同义词:CREATE SYNONYM dbo.synonym_name for dbo.procedure_name当运行由以下创建的可调用语句时:Callable...
使用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
本文标题为:java – JDBC调用Microsoft SQL Server存储过程的同义词
基础教程推荐
- Mybatis超详细讲解构建SQL方法 2023-02-19
- Spring MVC自定义日期类型转换器实例详解 2023-07-31
- java利用pdfbox+poi往pdf插入数据 2022-10-24
- Java并发程序刺客之假共享的原理及复现 2023-03-31
- Java 中 hashCode() 与 equals() 的关系(面试) 2023-06-01
- 详解Struts2中对未登录jsp页面实现拦截功能 2023-07-31
- JAVA biginteger类bigdecimal类的使用示例学习 2023-03-15
- 详解SpringBoot集成jsp(附源码)+遇到的坑 2023-07-31
- 解决maven maven.compiler.source和maven.compiler.target的坑 2023-08-10
- SpringBoot如何获取Kafka的Topic列表 2023-06-05