簡體   English   中英

JDBC調用Microsoft SQL Server存儲過程的同義詞

[英]JDBC call to a synonym to Microsoft SQL Server stored procedure

使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM