Java JDBC实现:有关参数的错误

Java JDBC实现:有关参数的错误,java,sql-server,stored-procedures,jdbc,inner-join,Java,Sql Server,Stored Procedures,Jdbc,Inner Join,我正在创建一个JDBC程序,该程序将显示所选学生在各自班级中的成绩列表。但是,我不断收到错误“过程或函数'getStudentHistory'需要参数'@studentId',但未提供该参数。” 以下是我在SQL Server中的存储过程: CREATE PROC [dbo].[getStudentHistory] @studentId INT AS SELECT LastName, FirstName, Year, Term, C.Prefix + ' ' + CAST(C.Num

我正在创建一个JDBC程序,该程序将显示所选学生在各自班级中的成绩列表。但是,我不断收到错误“过程或函数'getStudentHistory'需要参数'@studentId',但未提供该参数。”

以下是我在SQL Server中的存储过程:

CREATE PROC [dbo].[getStudentHistory]

@studentId INT
AS

    SELECT LastName, FirstName, Year, Term, C.Prefix + ' ' + CAST(C.Num AS CHAR(3)) + ' - ' + SEC.Letter AS [Course Number], 
                Units, isNull(G.Letter, ' ') AS Grade
    FROM Student S

 INNER JOIN StudentInSection SIS
    ON S.StudentId = SIS.StudentId
 INNER JOIN Section SEC
    ON SEC.SectionId = SIS.SectionId
 INNER JOIN Course C
    ON C.CourseId = SEC.CourseId
LEFT OUTER JOIN Grade G
    ON G.GradeId = SIS.GradeId
 INNER JOIN Semester SEM
    ON SEM.SemesterId = SEC.SemesterId

    WHERE S.StudentId = @studentId
    Order BY Units DESC
以下是我在主类中的函数:

@SuppressWarnings("resource")
public static void showStudentHistory()
{

    System.out.print("\n Please enter the Id of a current student you wanna see grades for");
    System.out.print("\n==>");

    Scanner insertstudentID = new Scanner(System.in);
    int passedStudentID = insertstudentID.nextInt() ;

    Student student = new Student(passedStudentID, null, null);
    List<Student> students =  student.getStudentHistory(passedStudentID);
    String tabs = "\t\t";
    System.out.println("LastName"+ tabs + "FirstName"+ tabs + "Year"+ tabs + "Term"+ tabs + "Course Number"+ tabs + "Units"+ tabs + "Grade");
    System.out.println("---------"+ tabs + "---------"+ tabs + "--------"+ tabs + "-----------");


//            Student tempStu = students.get(passedStudentID);
//            System.out.println(tempStu.getmStudentId() + "\t\t\t" +
//                    padRight(tempStu.getmFirstName(), 15) + "\t\t" +
//                    padRight(tempStu.getmLastName(), 15) + "\t\t" +
//                    tempStu.getmNum());

    Scanner kb = new Scanner(System.in);
    System.out.print("\nHit Enter to continue...");
    String discard = kb.nextLine();
@SuppressWarnings(“资源”)
公共静态无效showStudentHistory()
{
System.out.print(“\n请输入您想要查看成绩的当前学生的Id”);
System.out.print(“\n==>”;
Scanner insertstudentID=新扫描仪(System.in);
int passedStudentID=insertstudentID.nextInt();
学生=新学生(passedStudentID,null,null);
List students=student.getStudentHistory(passedStudentID);
字符串选项卡=“\t\t”;
系统输出打印项次(“姓氏”+“姓氏”+“年份”+“学期”+“课程号”+“单元”+“等级”);
System.out.println(“-----------”+制表符+“-----------”+制表符+“-----------”+制表符+“-----------”);
//Student tempStu=students.get(passedStudentID);
//System.out.println(tempStu.getmStudentId()+“\t\t\t”+
//padRight(tempStu.getmFirstName(),15)+“\t\t”+
//padRight(tempStu.getmLastName(),15)+“\t\t”+
//tempStu.getmNum());
扫描仪kb=新扫描仪(System.in);
System.out.print(“\n输入继续…”);
字符串discard=kb.nextLine();
以下是我的学生课堂上的附带功能:

public List<Student> getStudentHistory(int StudentID) {

       List<Student> students = new ArrayList<>();
       Connection con = dbConnect();
       PreparedStatement ps = null;
       ResultSet rs = null;
       try {
           ps = con.prepareCall("getStudentHistory");
           rs = ps.executeQuery();
           // Iterate through the data in the result set and load the List
//             while (rs.next()) {
//                 students.add(new Student(rs.getInt("StudentId")
//                         , rs.getString("LastName")
//                         , rs.getString("FirstName")
//                         , rs.getInt("Year")
//                         , rs.getString("Course Number")
//                         , rs.getInt("Units")
//                         , rs.getString("Grade")
//                         )                                                   
//                         );
//             }
       } catch (SQLException e) {
           e.printStackTrace();
       } finally {
           if (rs != null) try { rs.close(); } catch(Exception e) {}
           if (ps != null) try { ps.close(); } catch(Exception e) {}
           if (con != null) try { con.close(); } catch(Exception e) {}
       }
       return students;

}
公共列表getStudentHistory(int StudentID){
List students=new ArrayList();
Connection con=dbConnect();
PreparedStatement ps=null;
结果集rs=null;
试一试{
ps=con.prepareCall(“getStudentHistory”);
rs=ps.executeQuery();
//迭代结果集中的数据并加载列表
//while(rs.next()){
//学生。添加(新学生(rs.getInt(“学生ID”)
//,rs.getString(“姓氏”)
//,rs.getString(“名字”)
//,rs.getInt(“年度”)
//,rs.getString(“课程编号”)
//,rs.getInt(“单位”)
//,rs.getString(“等级”)
//                         )                                                   
//                         );
//             }
}捕获(SQLE异常){
e、 printStackTrace();
}最后{
如果(rs!=null),请尝试{rs.close();}捕获(异常e){}
如果(ps!=null),请尝试{ps.close();}捕获(异常e){}
如果(con!=null),请尝试{con.close();}捕获(异常e){}
}
留学生;
}

我知道我的存储过程本身在SQL Server中运行良好,但我对如何正确实现具有内部联接的存储过程感到困惑。我的所有其他用于创建、更新、删除和显示数据的存储过程都运行良好,但它们只使用一个学生表。我希望有任何关于社区可以给我什么,如果有人认为我的代码与找到问题的解决方案相关,我很乐意发布更多代码。

问题与您使用内部联接无关。存储过程需要一个参数,而您没有提供它。您应该像这样调用它:

ps = con.prepareCall("{call getStudentHistory(?)}");
ps.setInt(1, studentId);
ResultSet rs = ps.executeQuery();
另请参见的文档


作为旁注,我建议您使用java命名约定:变量和参数以小写字母开头,而不是大写字母(例如使用
studentID
,而不是
studentID
).

谢谢,您在修复有关缺少参数的错误方面是正确的。我的另一个问题是如何通过java类正确输出表的内容。@user3274463我建议您为此提出一个单独的新问题。每个问题只能问一个问题。如果您查看我的主类,我已经注释掉了一个问题我用来将Student类的4个属性输出到屏幕上的一组代码。为此,有一些get函数是针对构造函数定义的。我可以重新定义构造函数以包含其他值,这样我就可以为其他变量生成get函数,但这会改变变量的顺序这会使我剩下的代码失败,因为它会使其他函数调用错误的变量。有什么想法吗?谢谢,我会发布另一个问题。