Как создать столбец в oracle с типом данных объекта - PullRequest
0 голосов
/ 25 февраля 2020

Я веб-разработчик. Я из Javascript и фон Typescript. Несколько дней go я решил изучить JDB C с Oracle. Я создал очень простой c JDB C проект с JavaFX и Oracle. (На самом деле я пытаюсь имитировать c Microsoft Azure). У меня также есть поле Date, которое будет получать значение от встроенного компонента DateFicker JavaFx. Вот некоторая полезная информация:

Столбцы в таблице: mybranches

  1. имя_в ветви varchar (50)
  2. дата_ответа_дата
  3. branch_pulled_from varchar (50)

Проблема в том, что 2-й столбец, т.е. поле branch_created_on.

Вот мой код java: DataService. java

import java.time.LocalDate;
...

public class DataService {
    Connection con;
    PreparedStatement pstmt;

    static String branch_name="";
    static LocalDate branch_created_on;
    static String branch_pulled_from="";

    DataService() {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","tiger","scott");
        }
        catch(Exception e){ 
            System.out.println(e);
        }
    }

    public void getValue() {
        branch_name=AddNewBranchRecord.branchNameTextField.getText();
        branch_created_on=AddNewBranchRecord.datePicker1.getValue();
        branch_pulled_from=(String) AddNewBranchRecord.combo_box_1.getValue();
    }

    public void putValue() {
        System.out.println("Branch name: "+branch_name);
        System.out.println("Branch created on: "+branch_created_on);
        System.out.println("Branch pulled from: "+branch_pulled_from);
    }

    public void insertRecord() {
        getValue();
        try {
            pstmt=con.prepareStatement("INSERT INTO mybranches (branch_name,branch_created_on,branch_pulled_from) VALUES (?,?,?)");  
            pstmt.setString(1,branch_name);
            pstmt.setObject(2,branch_created_on);
            pstmt.setString(3,branch_pulled_from);
            pstmt.execute();
        } catch (SQLException ex) {
            Logger.getLogger(DataService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Вывод putValue также является правильным:

Имя ветви: 1000-test

Ветвь, созданная в: 2020-02- 11

Ветвь извлечена из: master

Но когда я вызываю insertRecord метод, я получаю это исключение:

SEVERE: null

java. sql .SQLException: недопустимый тип столбца

at oracle .jdb c .driver.DatabaseError.throwSqlException (DatabaseError. java: 112)

...

Это исключение не существует, если я удалю этот столбец даты из таблицы базы данных, а также код java. Мне очень жаль, если я задаю глупый вопрос. Я из Angular и реагирую фоном. Пожалуйста, поправьте меня.

1 Ответ

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

Вы действительно не хотите использовать setObject().

pstmt.setDate(2,branch_created_on); выдаёт мне ошибку: incompatible types: LocalDateCannot be converted to Date.

Вы можете объединить это с комментарием @ Кристофера, чтобы сделать:

pstmt.setDate(2,java.sql.Date.valueOf(branch_created_on));

С этим изменением и жестко запрограммированными переменными Java (а не из средства выбора), которые компилируются и работает с выводом:

Branch name: 1000-test
Branch created on: 2020-02-11
Branch pulled from: master

и в базе данных:

select * from mybranches;

BRANCH_NAME                                        BRANCH_CREATED_ON   BRANCH_PULLED_FROM                                
-------------------------------------------------- ------------------- --------------------------------------------------
1000-test                                          2020-02-11 00:00:00 master                                            
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...