java - 无法向 SQLite 中的表插入信息

标签 java sqlite sql-insert

我正在创建简单的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/

相关文章:

sql - 我可以从 SQLite 数据库生成 XML 数据吗?

java - 普罗米修斯计数器不一致

java - Firebase 数据库未更新

mysql - 音乐播放列表数据库设计

android - 如何将 .csv 文件导入到 SQLite for Android?

sql - Postgres 插入表格

java - JBoss缓存 : setting uniqueid for proper JMX monitoring

java - 在 Virgo-Server 中,导入包无法解析。由于捆绑约束中缺少约束而导致

java - JOOQ store() 不返回 ResultSet

mysql - INSERT GETDATE() 但它插入 0000-00-00 的值