SQL 尽管在测试中返回了一行,结果集还是空的
SQL ResultSet is empty despite having a row returned in tests
我正在为 Java 中的图书馆数据库系统构建一个简单的程序,顾客可以在其中借阅 return 书籍。该数据库有 4 个表:Book、Author、Patrons 和 AuthorIds。我正在使用下面的 SQL 语句来检索 1 行数据,其中包括所有内容以及一列,该列计算读者已经借了多少本书。问题是程序永远不会进入 while(res.next()) 循环,我认为这是因为结果集是空的。测试打印未打印,membID 未更改为顾客的 MemberID。
但是,当我在同一个数据库的数据库浏览器上尝试相同的 SQL 语句时,它 returns 1 行如预期的 BooksBorrowed 列。我的所有其他 ResultSet while 循环都有效并且 returned 行与其他 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 BooksBorrowed\r\n" +
"FROM Book\r\n" +
" JOIN AuthorIds USING (BookID)\r\n" +
" JOIN Author USING (AuthorID)\r\n" +
" JOIN Patron USING (MemberID)\r\n" +
"WHERE PatronFirstName LIKE ? AND PatronLastName LIKE ?\r\n" +
"GROUP BY MemberID\r\n" +
"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 后来被插入到 table 中,以便在借书时将其作为每次的临时展位,而不是顾客的实际 memberID,因此顾客名下没有借书。
我正在为 Java 中的图书馆数据库系统构建一个简单的程序,顾客可以在其中借阅 return 书籍。该数据库有 4 个表:Book、Author、Patrons 和 AuthorIds。我正在使用下面的 SQL 语句来检索 1 行数据,其中包括所有内容以及一列,该列计算读者已经借了多少本书。问题是程序永远不会进入 while(res.next()) 循环,我认为这是因为结果集是空的。测试打印未打印,membID 未更改为顾客的 MemberID。
但是,当我在同一个数据库的数据库浏览器上尝试相同的 SQL 语句时,它 returns 1 行如预期的 BooksBorrowed 列。我的所有其他 ResultSet while 循环都有效并且 returned 行与其他 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 BooksBorrowed\r\n" +
"FROM Book\r\n" +
" JOIN AuthorIds USING (BookID)\r\n" +
" JOIN Author USING (AuthorID)\r\n" +
" JOIN Patron USING (MemberID)\r\n" +
"WHERE PatronFirstName LIKE ? AND PatronLastName LIKE ?\r\n" +
"GROUP BY MemberID\r\n" +
"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 后来被插入到 table 中,以便在借书时将其作为每次的临时展位,而不是顾客的实际 memberID,因此顾客名下没有借书。