Вставить оператор в базу данных Derby - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь вставить несколько значений в таблицу в моей базе данных java derby, я получаю сообщение об ошибке java.sql.SQLSyntaxErrorException: предложение VALUES должно содержать хотя бы один элемент.Пустые элементы не допускаются.

    public boolean registerStudent(Student student)
    {
        try
        {
        Connection conn = DriverManager.getConnection("jdbc:derby://localhost:1527/AceDrivingSchool", "ADC", "ADC");
        Statement stmt = conn.createStatement();
        stmt.executeUpdate("INSERT INTO ADC.STUDENT(EMAILADDRESS, FORENAME, SURNAME, ADDRESSLINE1, ADDRESSLINE2,"
                + " POSTCODE, TELEPHONENO, GENDER, PASSWORD, ISREGISTERED, ISVERIFIED, PASSEDTHEORY, PASSEDPRACTICAL, DRIVINGLICENSENO, DOB"
                + ") VALUES('" + student.getEmailAddress() +
                "', '" + student.getForename() + "', '" + student.getSurname() + 
                "', '" + student.getAddressLine1() + "', '" + student.getAddressLine2() + "', '" + student.getPostcode() + 
                "', '" + student.getTelephoneNo() + "', '" + student.getGender() + "', '" + student.getPassword() + 
                "', '" + student.isIsRegistered() + "', '" + student.isIsVerified() + "', '" + student.isPassedTheory() + "', '" +
                "', '" + student.isPassedPractical() + "', '" + student.getdrivingLicenseNo() + "', '" + 
                new SimpleDateFormat("yyyy-MM-dd").format(student.getDob()) + "')");   
        conn.close();
        return true;
        }
        catch(SQLException ex)
        {
            ex.printStackTrace();
            return false;
        }
    }

Это должно привести значения к моей таблице

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

Ответ, данный @Basil, является полностью правильным, вам придется прочитать и понять его, чтобы получить общее представление о том, как построить и выполнить запрос.

В вашем случае, однако, я вижу в комментариях, что вы сталкиваетесь java.sql.SQLSyntaxErrorException: The number of values assigned is not the same as the number of specified or implied columns. Причиной этого является ваш искаженный SQL с дополнительным ",".

Удалите ", + и другое форматирование в sql, в итоге вы получите следующее:

INSERT INTO adc.student 
            ( 
                        emailaddress, 
                        forename, 
                        surname, 
                        addressline1, 
                        addressline2, 
                        postcode, 
                        telephoneno, 
                        gender, 
                        password, 
                        isregistered, 
                        isverified, 
                        passedtheory, 
                        passedpractical, 
                        drivinglicenseno, 
                        dob 
            ) 
            VALUES 
            ( 
                        student.Getemailaddress() , 
                        student.Getforename() , 
                        student.Getsurname() , 
                        student.Getaddressline1() , 
                        student.Getaddressline2() , 
                        student.Getpostcode() , 
                        student.Gettelephoneno() , 
                        student.Getgender() , 
                        student.Getpassword() , 
                        student.Isisregistered() , 
                        student.Isisverified() , 
                        student.Ispassedtheory() , 
                        , 
                        student.ispassedpractical() , 
                        student.getdrivinglicenseno() , 
                        NEW simpledateformat(yyyy-mm-dd).format(student.getdob()) 
            )

Сбой синтаксического анализа SQL в строке 33. Удалите дополнительный + "', '" после student.isPassedTheory(), и вы сможете выполнить запрос. После исправления кода должен получить следующий формат запроса:

"INSERT INTO ADC.STUDENT(EMAILADDRESS, FORENAME, SURNAME, ADDRESSLINE1, ADDRESSLINE2,"
                + " POSTCODE, TELEPHONENO, GENDER, PASSWORD, ISREGISTERED, ISVERIFIED, PASSEDTHEORY, PASSEDPRACTICAL, DRIVINGLICENSENO, DOB"
                + ") VALUES('" + student.getEmailAddress() +
                "', '" + student.getForename() + "', '" + student.getSurname() + 
                "', '" + student.getAddressLine1() + "', '" + student.getAddressLine2() + "', '" + student.getPostcode() + 
                "', '" + student.getTelephoneNo() + "', '" + student.getGender() + "', '" + student.getPassword() + 
                "', '" + student.isIsRegistered() + "', '" + student.isIsVerified() + "', '" + student.isPassedTheory() +
                "', '" + student.isPassedPractical() + "', '" + student.getdrivingLicenseNo() + "', '" + 
                new SimpleDateFormat("yyyy-MM-dd").format(student.getDob()) + "')");   
1 голос
/ 28 мая 2019

Правильный ответ от Desai обнаружил вашу синтаксическую ошибку в сгенерированном операторе SQL: неправильная запятая.

Вот лучший способ написать свой SQL, чтобы вы могли обнаружить этот тип ошибки самостоятельно.

Вы всегда должны строить свой SQL отдельно как фрагмент текста, чтобы облегчить отладку такого рода проблем.

Создайте свой текст SQL и проверьте

Используйте StringBuilder для создания текста.

Вот пример кода. Вы заполняете xxx вашими методами получения объекта (я слишком ленив).

StringBuilder sql = new StringBuilder() ;
String eol = "\n" ;  // linefeed
String comma = " , " ;  // SPACE + COMMA + SPACE
sql.append( "INSERT INTO ADC.STUDENT ( " ).append( eol ) ;
sql.append( "    EMAILADDRESS, FORENAME, SURNAME, ADDRESSLINE1, ADDRESSLINE2, POSTCODE, TELEPHONENO, GENDER, PASSWORD, ISREGISTERED, ISVERIFIED, PASSEDTHEORY, PASSEDPRACTICAL, DRIVINGLICENSENO, DOB " ).append( eol) ;
sql.append( ") VALUES (" ).append(eol) ;
sql.append( student.getEmailAddress() ).append( comma ) ; // EMAILADDRESS
sql.append( student.getForename()  ).append( comma ) ; // FORENAME
sql.append( xxx ).append( comma ) ; // SURNAME
sql.append( xxx ).append( comma ) ; // ADDRESSLINE1
sql.append( xxx ).append( comma ) ; // ADDRESSLINE2
sql.append( xxx ).append( comma ) ; // POSTCODE
sql.append( xxx ).append( comma ) ; // TELEPHONENO
sql.append( xxx ).append( comma ) ; // GENDER
sql.append( xxx ).append( comma ) ; // PASSWORD
sql.append( xxx ).append( comma ) ; // ISREGISTERED
sql.append( xxx ).append( comma ) ; // ISVERIFIED
sql.append( xxx ).append( comma ) ; // PASSEDTHEORY
sql.append( xxx ).append( comma ) ; // PASSEDPRACTICAL
sql.append( xxx ).append( comma ) ; // DRIVINGLICENSENO
sql.append( xxx ) ; // DOB — IMPORTANT no comma on the last item. 
sql.append( ") ;" ) ;

Затем распечатайте это значение, чтобы убедиться, что ваш SQL выглядит прямо. Сравните с другими примерами SQL , чтобы определить свою бу-бу.

Мы будем вежливо игнорировать сохранение пароля без солей и хэширования, номера лицензии и даты рождения, поскольку это представляет серьезную угрозу безопасности.

Кстати, вы должны представлять значение только для даты, например дату рождения, в вашем объекте Java как LocalDate объект. Ужасные классы Date & SimpleDateFormat были вытеснены несколько лет назад классами java.time . Метод LocalDate.toString() генерирует текст в стандартном формате ISO 8601, который для даты только совпадает с тем, который обычно используется в SQL.

Подготовленное заявление

Гораздо лучший способ, чем приведенный выше, - использовать подготовленное утверждение с заполнителями. Выполнение сгенерированного текста, как вы делали, сложнее для чтения и, что более важно, подвергает вас риску атаки SQL Injection .

StringBuilder sql = new StringBuilder() ;
String eol = "\n" ;  // linefeed
sql.append( "INSERT INTO ADC.STUDENT ( " ).append( eol ) ;
sql.append( "    EMAILADDRESS, FORENAME, SURNAME, ADDRESSLINE1, ADDRESSLINE2, POSTCODE, TELEPHONENO, GENDER, PASSWORD, ISREGISTERED, ISVERIFIED, PASSEDTHEORY, PASSEDPRACTICAL, DRIVINGLICENSENO, DOB " ).append( eol) ;
sql.append( ") VALUES (" ).append(eol) ;
sql.append( "? , " ) ; // EMAILADDRESS
sql.append( "? , " ) ; // FORENAME
sql.append( "? , " ) ; // SURNAME
sql.append( "? , " ) ; // ADDRESSLINE1
sql.append( "? , " ) ; // ADDRESSLINE2
sql.append( "? , " ) ; // POSTCODE
sql.append( "? , " ) ; // TELEPHONENO
sql.append( "? , " ) ; // GENDER
sql.append( "? , " ) ; // PASSWORD
sql.append( "? , " ) ; // ISREGISTERED
sql.append( "? , " ) ; // ISVERIFIED
sql.append( "? , " ) ; // PASSEDTHEORY
sql.append( "? , " ) ; // PASSEDPRACTICAL
sql.append( "? , " ) ; // DRIVINGLICENSENO
sql.append( "? " ) ;   // DOB — IMPORTANT no comma on the last item. 
sql.append( ") ; " ) ;

Опять распечатайте это и изучите.

String sqlOutput = sql.toString() ;
System.out.println( sqlOutput ) ;

Создать PreparedStatement. Для этого объекта вызовите методы set….

ps.setString( 1 , student.getEmailAddress() ) ;
…
ps.setObject( 15 , student.getDateOfBirth() ) ;  // Pass `LocalDate` object via `setObject` method using JDBC 4.2 or later.
...