我正在创建简单的java程序来管理车库。 在程序内您有登录窗口,然后您可以注册新用户。 问题是,当我想注册新用户时,在 SELECT 查询之后,程序被卡住(当新用户不在数据库中时)。
我已确保所有连接均已关闭,并确保我使用正确的查询执行(对于 SELECT 使用executeQuery,对于 INSERT 使用 updateQuery)。
寄存器类:
class RegisterButtonListener implements ActionListener {
Connection c = null;
Statement stmt = null;
String username, password;
String selectUser="";
@Override
public void actionPerformed(ActionEvent arg0) {
if (garageView.getTxtNewPassword().getText().isEmpty() == false
&& garageView.getTxtNewUsername().getText().isEmpty() == false){
username = garageView.getTxtNewUsername().getText();
password = garageView.getTxtNewPassword().getText();
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:GarageDoctor.db");
c.setAutoCommit(false);
System.out.println("Opened database successfully - SELECT");
stmt=c.createStatement();
String selectSql = "SELECT NAME FROM USERS WHERE NAME = '"+username+"';";
ResultSet rs = stmt.executeQuery(selectSql);
while(rs.next()) {
selectUser+=rs.getString("name");
System.out.println(selectUser);
if(selectUser.equals(username)) {
JOptionPane.showMessageDialog(garageView, "User Already Exists!");
System.out.println("closing");
selectUser="";
rs.close();
stmt.close();
c.close();
System.out.println("closed");
}
else {
System.out.println("user isn't in db, inserting now");
DBInsertNewUsers(username,password);
}
}
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
}else {
JOptionPane.showMessageDialog(garageView, "Invalid input");
}
}
}
这会导致 DBInsertNewUsers:
public void DBInsertNewUsers(String username,String password) {
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:GarageDoctor.db");
c.setAutoCommit(false);
System.out.println("Opened database successfully - Insert");
stmt = c.createStatement();
System.out.println("stmt = c.createStatement();");
String sql = "INSERT INTO USERS (ID,PASSWORD,NAME) VALUES ("+i+",'"+password+"', '"+username+"');";
stmt.executeUpdate(sql);
System.out.println("stmt.executeUpdate(sql);");
i++;
stmt.close();
c.commit();
System.out.println("action done successfully - Insert");
c.close();
JOptionPane.showMessageDialog(garageView, "Register Success");
}
catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
}
当尝试注册新用户时,应用程序卡住了,最后一条控制台消息是:
Opened database successfully - SELECT
最佳答案
调用 DBInsertNewUsers 的代码位于 while(rs.next()) 循环内。在没有匹配行的情况下,rs.next() 将返回 false(因为没有行)并且控制永远不会进入该循环。您还应该考虑使用“try-with-resources”模式来关闭资源并使用准备好的语句:
String query = "SELECT NAME FROM USERS WHERE NAME = ?";
try (Connection con = DriverManager.getConnection(myConnectionURL);
PreparedStatement ps = con.prepareStatement(query);) {
ps.setString(1,username);
try(ResultSet rs = stmt.executeQuery(selectSql);){
if(rs.next()){
selectUser+=rs.getString("name");
}else{
System.out.println("user isn't in db, inserting now");
DBInsertNewUsers(username,password);
}
}
}
关于java - 无法向 SQLite 中的表插入信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57046519/