Java和MySQL-setBoolean()方法出错

问题描述 投票:0回答:1

我收到错误:“列数与第1行的值计数不匹配”,但是我已经计数了,并且列数正确,我觉得该错误与setBoolean()方法有关。我有8列,您会看到我在方法中传递了7个参数,因为其中一列是AUTO_INCREMENTE。如果我不使用setBoolean方法将其替换为setString,setInt或其他任何东西,但我使用setBoolean()进行替换时,我的编码效果很好。

这是我的代码,希望我的问题更清楚:

我的Java中有一个自动代码,如果数据库不存在,它会创建数据库及其相应表:

DB.createDB("userSecInfo");
DB.createTable("accountInfo", "userSecInfo", "("+
                                              "Username VARCHAR(40) NOT NULL, "+
                                              "Pass VARCHAR(40) NOT NULL, "+
                                              "chkPwChange BOOLEAN NOT NULL DEFAULT FALSE, "+
                                              "chkPwCntChange BOOLEAN NOT NULL DEFAULT FALSE, "+
                                              "chkPwNoExpires BOOLEAN NOT NULL DEFAULT FALSE, "+
                                              "chkPwExpires BOOLEAN NOT NULL DEFAULT FALSE, "+
                                              "expirydays INT, "+
                                              "UserID INT NOT NULL AUTO_INCREMENT, "+
                                              "PRIMARY KEY (UserID))");

我曾尝试以不同的方式为MySQL定义所有布尔变量,例如BOOL,BOOLEAN(如上所述)以及TINYINT&TINYINT(1);但变量定义似乎不是问题。

然后,程序在创建数据库和表后,将继续提取用户输入的信息并将其插入数据库:

DB.insertUserSecAccountInfo("userSecInfo", "accountInfo", tFUsername.getText(),
                                            String.copyValueOf(pFPassword.getPassword()), chckbxUserMustChange.isSelected(), 
                                            chckbxUserCannotChange.isSelected(), chckbxPasswordNeverExpires.isSelected(), 
                                            chckbxPasswordExpiresAnd.isSelected(), Integer.parseInt(tFdays.getText()));

insertUserSecAccountInfo方法如下:

public void insertUserSecAccountInfo(String db_name,String table_name, String Username, String Pass,
             boolean chkPwChange,  boolean chkPwCntChange, boolean chkPwNoExpires,boolean chkPwExpires,
             int expirydays) throws Exception {
            try {
                openConnection("whatever","password",db_name);
                String Query ="INSERT into "+ table_name +" values(?,?,?,?,?,?,?)";
                ps = Conexion.prepareStatement(Query);
                ps.setString(1, Username);              
                ps.setString(2, Pass);
                ps.setBoolean(3, chkPwChange);              
                ps.setBoolean(4, chkPwCntChange);       
                ps.setBoolean(5, chkPwNoExpires);   
                ps.setBoolean(6, chkPwExpires);
                ps.setInt(7, expirydays);
                ps.executeUpdate();
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, "Error saving data"));
                ex.printStackTrace();
            } finally {
                closeConnection();
            }
        }

当我运行它时,它向我显示错误:“列计数与第1行的值计数不匹配”。但是然后我直接在MySQL中基本上运行以下相同的代码行,并将其完全插入:

insert into accountInfo(Username,Pass,chkPwChange,chkPwCntChange,chkPwNoExpires,chkPwExpires,expirydays) values ('Hola','No',true,true,true,true,56);

因此,我感到setBoolean()方法存在问题,该方法可能无法将布尔变量从Java正确映射或正确传递给MySQL;有没有人有任何类似的问题?我将非常感谢对此的任何指导。

先谢谢您。

java mysql jdbc
1个回答
0
投票

因为您没有明确命名每个列,所以适用所有列的隐式默认值。其中一个具有默认值这一事实是无关紧要的(自动计数不超过且不少于以下脚本:“创建一个序列,现在将此列的默认值设置为NEXTVAL(nameOfGeneratedSequence))。

setBoolean无关。

正如一些评论者所说,您需要始终显式命名您要设置的列,因此:`INSERT INTO“ + tableName +”(用户名,密码等)值(?,?,...等)“。

安全性注意:在数据库中以纯文本格式存储密码并不适合最低限度的安全性最佳做法。如果这样部署,并且一旦泄漏出去,您将可能遭受高额罚款甚至更严厉的罚款(在欧洲通过GDPR;其他司法管辖区通常也有类似的立法),更不用说大量应得的媒体影响了。不要这样做。 –使用bcrypt并存储散列。

© www.soinside.com 2019 - 2024. All rights reserved.