2012-02-14 7 views
4

Microsoft(sqljdbc4.jar)が提供するJDBCドライバを使用して、定義済みの同義語を使用してストアドプロシージャを呼び出すことができません。 I.作成された呼び出し可能なステートメントを実行するときにMicrosoft SQL Serverストアドプロシージャの同義語へのJDBCコール

CREATE SYNONYM dbo.synonym_name for dbo.procedure_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) 

(私は場合:

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

私は例外を取得しますプロシージャを直接呼び出す(同義語を迂回する)すべて正常に動作する)。

さらに、MicrosoftのドライバをJTDSに置き換えると、すべて正常に動作します。

CallableStatementは、Microsoft SQL ServerのJDBCドライバでストアドプロシージャの同義語を使用してどのように実行できますか?

+0

私はそこに問題があることがわかりますが、何ですか?スティオン? –

+0

@Paul Sasik - 私は質問を追加しました。おそらく読みにくいですが、私はそれをよりうまく表現できませんでした。 – diciu

+0

+1いいですね。私はそれがあなたが探していた解決策だと思っていましたが、あなたの仕事からいくつかの道がありました。 Btw、なぜJTDSは良い解決策ではありませんか?そして、あなたはストアドプロシージャの同義語を持たなければならないのですか? –

答えて

1

SQL Serverのシノニムには、クエリ可能なメタデータがありません。このエラーで判断すると、JDBCはJavaコードで宣言されたパラメータがストアドプロシージャで宣言されたパラメータと一致するかどうかを確認しようとしています。欠落しているメタデータが原因で失敗します。

これを回避するには、シノニムの代わりにパススルーストアドプロシージャを作成するしかありません。 ですから、この手順を持っている場合:同義語

CREATE SYNONYM dbo.myProcedure FOR dbo.realProcedure; 

ドロップし、代わりにこのプロシージャを作成します:

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

をそして、あなたはこのシノニムを持って

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

関連する問題