2017-05-31 24 views
1

我在Java類下面的代碼:Sql Server的通話

CallableStatement stmt = con.prepareCall({ call myInsert(?, ?, ?)}); 
stmt.setString(1, myTO.getField1()); 
stmt.setString(2, myTO.getField2()); 
stmt.setString(3, myTO.getField3()); 
stmt.executeUpdate(); 

而且在數據庫myInsert被定義爲:

IF OBJECT_ID ('myInsert', 'P') IS NOT NULL 
DROP PROCEDURE myInsert; 

GO 

CREATE PROCEDURE [myInsert] 
@Field1 as uniqueidentifier, 
@Field2 as varchar(120), 
@Field3 as varchar(120) 
@myId UNIQUEIDENTIFIER OUTPUT 

AS 

SET @myId = NEWID() 

INSERT INTO myTable 
    (myID, Field1, Field2, Field3) 
    VALUES (@myID, @Field1, @Field2, @Field3) 

然而,該呼叫與以下錯誤而失敗:

com.microsoft.sqlserver.jdbc.SQLServerException: Procedure or function 'myInsert' expects parameter '@myId', which was not supplied. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:232) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1672) 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:460) 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:405) 
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7535) 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2438) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:208) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:183) 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:348) 
    at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:98) 
    at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:98) 

我在做什麼錯?我該如何解決這個問題?

感謝您的閱讀!

回答

0

我想你錯過了你的參數。

CallableStatement stmt = con.prepareCall("{ call myInsert(?, ?, ?, ?)}"); 
stmt.setString(1, myTO.getField1()); 
stmt.setString(2, myTO.getField2()); 
stmt.setString(3, myTO.getField3()); 
stmt.registerOutParameter(4, java.sql.Types.VARCHAR); 
stmt.executeUpdate(); 
System.out.println(stmt.getString(4)); // <-- print @myId 
+0

謝謝..這是什麼失蹤! – Nik