У меня проблемы с сохранением даты из JDateChooser в базу данных MySQL

У меня проблемы с передачей данных из моего графического интерфейса в базу данных MySQL. Я собираю информацию от JTextFields и JDateChooser в базу данных. Все остальное работает, кроме даты. Я попробовал несколько методов, которые нашел в Интернете, и ни один из них не сработал. Я также проверил таблицу, чтобы убедиться, что тип данных «ДАТА» включен в моей таблице «информация о пациенте». Если я удалю JDateChooser, мой запрос сработает. В противном случае я получу это сообщение об ошибке:

Java.lang.NullPointerException

Я включаю свой исходный код с этим сообщением.

//Event handler adds records
//to the database

JButton subInfoBtn = new JButton("SUBMIT AND CONTINUE");

subInfoBtn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {

            try {
                //Invokes "javaconnect" class
                //to link to MySQL database
                conn = javaconnect.ConnecrDb();

                //Invokes SQL Statement from "Connection" Object
                pst = conn.createStatement();

                //SQL query commands event handler to access
                //"patientinfo" table, to insert data to columns.
                pst.executeUpdate("INSERT into patientinfo(firstName, lastName, DOB, age, SSN, "
                                  + "address, phone,email, emergencycontact, emergencyphone) "
                                  + "VALUES" + "('"+firstTxt.getText() + "', '" + lastTxt.getText()
                                  + "', '" + DOBTxt.getDate() + "' ,'" + ageTxt.getText() + "', '"
                                  + ssnTxt.getText() + "', "+ " '" + addressTxt.getText() +"',
                                  '"+phoneTxt.getText()+"'  , '"+emailTxt.getText()+"'  ,
                                  '"+emergencyTxt.getText()+"'  , '"+emergPhoneTxt.getText()+"'  )");


                //Closes Database Connection
                conn.close();
                JOptionPane.showMessageDialog(null, "Pantient Information Saved Succesfully");

            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e);
            }
        }
    });

    subInfoBtn.setFont(new Font("Tahoma", Font.BOLD, 14));
    subInfoBtn.setBounds(305, 286, 220, 23);
    contentPane.add(subInfoBtn);

//Also, I have tried to use SimpleDateFormat and
//((JTextField)jDateChooser1.getDateEditor().getUiComponent()).getText();
//Without any luck.  I am also aware of using Prepare Statement to avoid SQL injections, but
//I would like to solve the JDateChooser bonding data dilema into MySQL database.

person Federico Chin    schedule 06.09.2014    source источник
comment
При публикации вопроса сократите свой код до минимально возможного примера, показывающего вашу проблему/вопрос, предпочтительно SSCCE.   -  person Basil Bourque    schedule 06.09.2014


Ответы (2)


попробуйте что-то вроде этого. Преобразуйте java.util.Date, который вы вводите, в java.sql.Date для его сохранения в базе данных Mysql, поскольку mysql хранит дату в формате yyyy-MM-dd

public static java.sql.Date convertUtilDateToSqlDate(java.util.Date date){
    if(date != null) {
        java.sql.Date sqlDate = new java.sql.Date(date.getTime());
        return sqlDate;
    }
    return null;
}

Тогда сделай это по-своему

PreparedStatement statement = conn.prepareStatement("INSERT INTO patientinfo"+
                                     "(firstName, lastName, DOB, age, SSN, address," +
                                     "phone,email, emergencycontact, emergencyphone)"+
                                     "VALUES(?,?,?,?,?,?,?,?,?,?)");
statement.setTimestamp(1,sqlDate);
statement.setString(1,firstTxt.getText());
statement.setString(2,lastTxt.getText());
statement.setDate(3,convertUtilDateToSqlDate(DOBTxt.getDate()));
statement.setString(4,ageTxt.getText());
statement.setString(5,ssnTxt.getText());
statement.setString(6,addressTxt.getText());
statement.setString(7,phoneTxt.getText());
statement.setString(8,emailTxt.getText());
statement.setString(9,emergencyTxt.getText());
statement.setString(10,emergPhoneTxt.getText());
int i = statement.executeUpdate();
if(i>0){
    System.out.println("Successfull");
 }

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

person SparkOn    schedule 06.09.2014
comment
SparkOn, спасибо, что нашли время, чтобы помочь мне с дилеммой jdatechooser. Я попытался реализовать класс h ava.sql.Date, но все равно получаю ту же ошибку Java.lang.NullPointerException. Есть ли у вас другие идеи решения этой проблемы? Я также убедился, что моя таблица имеет тип данных DATE, а порядок столбцов соответствует той же последовательности, что и мой исходный код, и ничего. - person Federico Chin; 07.09.2014
comment
Кроме того, я пытался реализовать PreparedStatement, и у меня это не работает. У меня есть еще один столбец в моей таблице под названием «идентификатор пациента», который генерирует автоматическое целое число. Поскольку я не объявляю столбец идентификатора пациента в своем запросе, имеет ли значение, какой индекс я объявляю в своем запросе? Например, идентификатор пациента — это столбец 1 в таблице сведений о пациенте, но я просто хочу, чтобы пользователь ввел остальные данные. Поэтому, используя thestatement.setString(1,firstTxt.getText()); еще будет в силе? Еще раз спасибо за вашу помощь. - person Federico Chin; 07.09.2014
comment
Привет еще раз SparkOn. Мне удалось реализовать PrepareStatement, но у меня все еще возникают проблемы с вводом даты с помощью JDateChooser из библиотеки JCalendar. Я даже пробовал преобразование класса java.sql.Date, о котором вы упоминали ранее, и ничего. Еще раз спасибо за вашу помощь. - person Federico Chin; 08.09.2014
comment
возникли проблемы, как что? - person SparkOn; 08.09.2014
comment
Я все еще получаю то же самое исключение Java.lang.NullPointerException, когда пытаюсь использовать JDateChooser. Если я удалю JDateChooser и столбец DOB из своего запроса, все остальное будет работать. - person Federico Chin; 08.09.2014
comment
это может быть потому, что ваша дата будет нулевой - person SparkOn; 08.09.2014

java.sql.Date date = new java.sql.Date(dateChooser.getDate().getTime());

Преобразуйте Date в объект sql, затем сохраните в базе данных. Надеюсь, это сработает.

person Ishwar Surywanshi    schedule 06.09.2014
comment
Привет Ишвар, Спасибо за вашу помощь. Я уже использовал класс java.sql.Date, но все еще получаю исключение Java.lang.NullPointerException. Я не знаю, что еще делать. Я также пробовал разные другие методы и классы, и все равно без радости. То же сообщение. Я также передал классу параметры и операторы if... else на случай, если компонент JDateChooser пуст, и все равно получаю тот же результат. У тебя есть другие идеи? Еще раз спасибо за помощь. - person Federico Chin; 07.09.2014