Невозможно вставить значения в базу данных Результирующее значение находится вне диапазона для ДЕСЯТИЧНОГО / ЧИСЛОВОГО типа данных (3.1)

#java #database #derby

#java #База данных #дерби

Вопрос:

Когда я запускаю свой код, он работает, даже показывает эту ошибку:

java.sql.SQLDataException: The resulting value is out of range for the DECIMAL / NUMERIC data type (3.1).

Мой Java-файл:

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class Aula4 {
    public static void main (String[] args) throws ClassNotFoundException, SQLException {
        try {
            Class.forName("org.apache.derby.jdbc.ClientDriver");
            
            String url = "jdbc:derby://localhost:1527/sistema_academico";
            
            String usuario = "app";
            String senha = "app";
            Connection conexao;
            Scanner ler = new Scanner(System.in);
            conexao = DriverManager.getConnection(url, usuario, senha);
            int id_aluno;
            double nota;
            String nome = null;
            
            System.out.println("Welcome, type your id: ");
            id_aluno = ler.nextInt();
            
            System.out.println("Now, do you need to type your name: ");
            nome = ler.next();
            
            System.out.println("And finally, type your grade:  ");
            nota = ler.nextDouble();
            
            String SQL_Update = "UPDATE aluno set NOTA=? WHERE id_aluno=?";
            String sql = "insert into aluno "  
                  "(id_aluno,nome, nota) "  
                  "values (?,?,?)";
            PreparedStatement stmt = conexao.prepareStatement(sql);
            stmt.setInt(1, id_aluno);
            stmt.setString(2, nome);
            stmt.setDouble(3, nota);
            stmt.executeUpdate();
            stmt.execute();
            stmt.close();
            System.out.println("Accomplished!!");
            
            stmt = conexao.prepareStatement(sql);
            
            }
             catch (SQLException ex){
            System.out.println("Conection failed!" ex);
        } 
    }
}

 

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

Ответ №1:

stmt.execute(); слишком много, и действительно могло вызвать «ошибочную» ошибку. Последнее stmt = conexao.prepareStatement(sql); тоже.

Ссылка на MySQL может помочь. ДЕСЯТИЧНОЕ число (3,1) имеет диапазон -9,9 .. 9,9. Это может быть правильный масштаб, в противном случае вы, возможно, предполагали ДЕСЯТИЧНОЕ число (5,2).

nota может быть проверено.

Поскольку функция с плавающей запятой ( double ) неточна, возможно, даже лучше использовать BigDecimal (фиксированную точку) на стороне java.

         System.out.println("And finally, type your grade:  ");
        BigDecimal bdnota = ler.nextBigDecimal();

        // Check input: scale and digits
        System.out.println("Scale: "   bdnota.scale());

        stmt.setBigDecimal(3, bdnota);