【发布时间】:2020-06-09 13:20:14
【问题描述】:
我是一名网络开发人员。我来自 Javascript 和 Typescript 背景。几天前,我决定用 Oracle 学习 JDBC。我用 JavaFX 和 Oracle 创建了一个非常基本的 JDBC 项目。 (实际上我正在尝试模仿 Microsoft Azure)。我还有一个 Date 字段,它将从 JavaFx 内置的 Datepicker 组件中获取其值。以下是一些有用的信息:
表格中的列:mybranches
- branch_name varchar(50)
- branch_created_on 日期
- branch_pulled_from varchar(50)
问题出在第二列,即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 方法时,我得到了这个异常:
严重:无
java.sql.SQLException:无效的列类型
在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
...
如果我从数据库表中删除该日期列以及 java 代码,则不存在此异常。如果我问了一个愚蠢的问题,我非常抱歉。我来自 Angular 和 React 背景。请纠正我。
【问题讨论】:
-
可能不支持
LocalDate。您可以尝试java.sql.Date.valueOf(localDate);获取java.util.Date。我确信有一种方法可以通过某种自定义转换器存储LocalDate,这会更好,但可能不是开箱即用。 -
@ChristopherSchneider。你说得对。但我都试过了。但仍然出现异常。
-
日期必须是自定义的。可能是两年前,也可能是两年后。
-
为什么要使用
setObject而不是setDate或setTimestamp? -
@AlexPoole。我很高兴你问了这个问题。其实我已经面对这个了。题。
pstmt.setDate(2,branch_created_on);给了我error: incompatible types: LocalDateCannot be converted to Date。因为 JavaFX DatePicker 是LocalDate。答。不要使用java.sql.Date继续使用LocalDate。你可以使用pstmt.setObject(2, branch_created_on)。