【问题标题】:Why is an error arising in updating info into SQL Database from Java code?为什么将信息从 Java 代码更新到 SQL 数据库时会出现错误?
【发布时间】:2019-09-20 10:35:24
【问题描述】:

我正在为系统的注册页面编写代码。单击按钮后,系统将检查用户是否年满 14 岁。如果为真,系统应将所有输入的数据保存到 SQL 数据库中。

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
       // TODO add your handling code here:
       int age = Integer.parseInt(Age_Input.getText());
       String firstname = FirstName_Input.getText();
       String surname = Surname_Input.getText();
       String email = Email_Input.getText();
       String userid = UserID_InputSignUp.getText();
       char[] pass = Password_InputSignUp.getPassword();

       if (age<14) {
           JOptionPane.showMessageDialog(null,"Sorry, You need to be at least 14 years to use this software... ");
           new Login_Page().setVisible(true);
           this.setVisible(false);
       } else {
           try {
              Class.forName("com.mysql.cj.jdbc.Driver");
              Connection connect = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/user_info", "root", "nerdswonka");
              Statement stmt = connect.createStatement();

              String query1 = "INSERT INTO user_info(user_id, password, firstname, lastname, emailid, age) VALUES('"+userid+"', "+Arrays.toString(pass)+", '"+firstname+"', '"+surname+"', '"+email+"', "+age+");";
              stmt.executeUpdate(query1);

              JOptionPane.showMessageDialog(null, "Account Creation succesful!");
              stmt.close();
              connect.close();

          } catch (Exception e) {
              JOptionPane.showMessageDialog(null, "Error in connecting to SQL Database");
        }

          new Login_Page().setVisible(true);
          this.setVisible(false);
    }

}                                                                 

代码没有将任何内容更新到数据库中,只是在出现异常(错误)后显示 JOptionPane。可以对代码进行哪些编辑以便将值存储到 SQL 中?

【问题讨论】:

  • 第一个更改:打印错误消息以了解它的含义...更好,还打印堆栈跟踪e.printStackTrace() - 我怀疑Arrays.toString(pass) 不是数据库接受什么,可能你想要new String(pass)

标签: java mysql database netbeans database-connection


【解决方案1】:

失败的直接原因可能是您的INSERT 语句包含以下不是单引号的字符串:

Arrays.toString(pass)

但是,您应该完全放弃当前的方法,而使用准备好的语句:

String sql = "INSERT INTO user_info (user_id, password, firstname, lastname, emailid, age) " +
    "VALUES (?, ?, ?, ?, ?, ?)";

try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/user_info", "root", "nerdswonka");
    PreparedStatement ps = conn.prepareStatement(sql)) {
        ps.setString(1, userid);
        ps.setString(2, Arrays.toString(pass));
        ps.setString(3, firstname);
        ps.setString(4, surname);
        ps.setString(5, email);
        ps.setInt(6, age);

        int row = ps.executeUpdate();
        System.out.println(row); // rows inserted (should be 1)

    }
    catch (SQLException e) {
        System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

Prepared statements 做了很多事情,其中​​之一是处理有关如何在 SQL 查询中正确转义文字数据的混乱细节。在这种情况下,它们使您不必担心在插入的 Java 字符串周围放置单引号。语句还可以防止 SQL 注入等不良事件的发生。

【讨论】:

  • 是的,小心Little Bobby Tables [:-)
  • 我试过你准备好的语句代码。代码第 5 行的“user_id”下方出现红色错误行。在代码的第 2 行中,我还应该在值周围使用单引号和双引号吗?
  • @VittalKamath 我修正了一个错字,我有user_id 而不是userid。不,不要在任何地方加上单引号。 VALUES 在语句中由 ? 占位符表示。您无需担心如何格式化任何内容。
  • SQL 状态:S1009 参数索引超出范围(1> 参数个数,即0)。运行您的代码后出现此错误...
  • 我不知道你在运行什么,但我的代码应该不会产生这个错误。
【解决方案2】:

您没有在 catch 块中打印您的异常。您可以使用 e.printStackTrace();先打印异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2012-05-15
    相关资源
    最近更新 更多