Java SQL server异常:使用jdbc连接检索数据时

Java SQL server异常:使用jdbc连接检索数据时,java,sql,sql-server,stored-procedures,Java,Sql,Sql Server,Stored Procedures,我使用Java的callable接口,尝试读取用sqlserver编写的存储过程的输出变量值 存储过程: CREATE PROCEDURE [Get_Project_Name_Test] @project_id int, @project_name varchar(150) OUTPUT AS BEGIN SET NOCOUNT ON; SET @project_name = (SELECT Name from Project where Project_Id

我使用Java的
callable
接口,尝试读取用sqlserver编写的存储过程的输出变量值

存储过程:

CREATE PROCEDURE [Get_Project_Name_Test] 
    @project_id int,
    @project_name varchar(150) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    SET @project_name = (SELECT Name from Project where Project_Id = @project_id)
END
GO
这里,
@project\u id
是输入变量,
@project\u name
是输出变量。我想从Java应用程序中读取输出变量的这个值。当我运行代码时,我得到一个sql异常

它说:

形式参数“@project_id”未声明为输出 参数,但传入请求输出的实际参数

实际上,这不是一个输出参数
@project_id
是用于检索结果的输入参数

用于调用此存储过程的Java代码

CallableStatement cstmt = con.prepareCall("{call Get_Project_Name_Test(?)}");
cstmt.setInt(1, 148);
cstmt.registerOutParameter(1, java.sql.Types.VARCHAR);
cstmt.executeQuery();
String x = cstmt.getString(1);
System.out.println(x);
如何找出错误的原因?

应该

cstmt.registerOutParameter(1, java.sql.Types.VARCHAR);


谢谢你的建议。我试过这个。但它不起作用。我得到了异常“SQLServerException:索引2超出范围”,这是因为您只向存储过程传递一个参数,需要两个;获取项目名称测试(?),是,获取。。。谢谢。它很好用。我的印象是,调用存储过程时必须只提供输入参数。我现在明白了。它起作用了。再次感谢。
 cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);