Java & MySQL - Ошибка с методом setBoolean () - PullRequest
0 голосов
/ 19 февраля 2020

Я получаю сообщение об ошибке: «Количество столбцов не соответствует значению в строке 1», но я посчитал, у меня есть правильное количество столбцов, и я чувствую, что ошибка связана с методом setBoolean (). У меня есть 8 столбцов, и вы увидите, что я передаю 7 аргументов в моем методе, поскольку один из столбцов является AUTO_INCREMENTE. Мое кодирование работает прекрасно, если я не использую метод setBoolean, заменяя его на setString, setInt или что-то еще, но не тогда, когда я делаю это с setBoolean ().

Вот мой код, который, я надеюсь, прояснит мою проблему:

У меня есть автоматический c код в моем 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; У кого-нибудь была подобная проблема? Я был бы очень признателен за любые указания с этим.

Заранее спасибо.

1 Ответ

1 голос
/ 19 февраля 2020

Поскольку вы не назвали каждый столбец явно, применяется неявное значение по умолчанию все столбцы . Тот факт, что у одного из них есть значение по умолчанию, не имеет значения (а автосчет не больше и не меньше, чем сценарий: «Создайте последовательность, теперь установите значение по умолчанию для этого столбца NEXTVAL(nameOfGeneratedSequence)).

Это не имеет ничего общего с setBoolean.

Как говорили некоторые комментаторы, вам всегда нужно явно указывать имена столбцов, которые вы устанавливаете, так: `INSERT INTO" + tableName + "( Имя пользователя, Pass, et c) VALUES (?,?, ... et c) ".

БЕЗОПАСНОСТЬ ПРИМЕЧАНИЕ. Хранение паролей в виде простого текста в базе данных не соответствует минимальным лучшие практики безопасности. Если такое развертывание произойдет, и оно когда-нибудь просочится, вы, вероятно, получите огромный штраф или хуже (в Европе через GDPR; другие юрисдикции часто имеют аналогичное законодательство), не говоря уже о чертовом количестве заслуженных выпадов в СМИ. Не делайте так. - используйте bcrypt и сохраните вместо него ha sh.

...