我正在用Java为图书馆数据库系统构建一个简单的程序,读者可以在其中借阅和归还书籍。该数据库有4个表:Book、Author、Patrons和AuthorId。我使用下面的SQL语句来检索1行数据,其中包括所有内容,再加上一列,该列计算用户已经借了多少书。问题是程序永远不会进入while(res.next(((循环,我认为这是因为结果集是空的。测试打印不会打印,membID也不会更改为用户的MemberID。
但是,当我在同一数据库的数据库浏览器上尝试相同的SQL语句时,它会像预期的那样返回一行BooksBorrowed列。我的所有其他ResultSet while循环都能工作,并与其他SQL语句一起返回行,只是这一个没有,我不知道为什么。
public void borrowBooks(String fName, String lName, Scanner input) throws SQLException {
//first find out how many books the user has already borrowed
int booksBorrowed = 0;
int membID = 1; //this will be used for later
sql = "select *, Count(MemberID) AS BooksBorrowedrn" +
"FROM Bookrn" +
" JOIN AuthorIds USING (BookID)rn" +
" JOIN Author USING (AuthorID)rn" +
" JOIN Patron USING (MemberID)rn" +
"WHERE PatronFirstName LIKE ? AND PatronLastName LIKE ?rn" +
"GROUP BY MemberIDrn" +
"ORDER BY BookID ASC";
PreparedStatement stmt = connection.prepareStatement( sql );
stmt.setString(1, fName);
stmt.setString(2, lName);
ResultSet res = stmt.executeQuery();
while(res.next()) {
booksBorrowed = res.getInt("BooksBorrowed");
System.out.println(res.getInt("MemberID"));
System.out.println("Test");
membID = res.getInt("MemberID");
}
if(booksBorrowed >= 2) {
System.out.println("You have already borrowed the maximum amount of 2 books. Return books to borrow more");
}
我发现了这一点,我应该在一个单独的查询中获得memberID,因为我试图在同一个查询中将其更改为相应的赞助人,同时我也试图获得所借书籍的数量。问题是,如果顾客没有借阅任何书籍,那么结果集将为空,memberID也不会从临时初始化的状态更改。这个memberID后来被插入到书籍借阅时的表中,因此它将是每次的临时替身,而不是顾客的实际memberID,因此,赞助人名下不会有借来的书。