Java JDBC实现:有关参数的错误
我正在创建一个JDBC程序,该程序将显示所选学生在各自班级中的成绩列表。但是,我不断收到错误“过程或函数'getStudentHistory'需要参数'@studentId',但未提供该参数。” 以下是我在SQL Server中的存储过程: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
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函数,但这会改变变量的顺序这会使我剩下的代码失败,因为它会使其他函数调用错误的变量。有什么想法吗?谢谢,我会发布另一个问题。