#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);