2016-12-25 56 views
1

每当我想从Java插入日期到我的Oracle数据库时,都会遇到问题。插入日期在SQL Developer中工作,但不是通过Java

这里是我的Java代码示例:

PreparedStatement prest = myConn.prepareStatement(
    "insert into QuickTicket (issueDate , pssngr_id , trip_number) values(?,?,?)") ; 

String s = "2016/12/25" ; 

prest.setString(1, s); 
prest.setInt(2, passengerID); 
prest.setInt(3, tripID); 

prest.executeUpdate(); 

例外:

java.sql.SQLDataException:ORA-01861:文字不匹配格式字符串

但是,当我在SQL Developer中使用相同的语句时:

insert into QuickTicket (issueDate , pssngr_id , trip_number) values 
('2016/12/25' , 1234567897 , 4) ; 

我没有得到任何错误 - >插入了1行。

任何想法为什么?

+1

亲爱的选民:你总是欢迎投票,但请说出一个原因,以便我可以改善我的问题。 –

+1

尝试使用此PreparedStatement perst = myConn.prepareStatement替换第一行(“insert into QuickTicket(issueDate,pssngr_id,trip_number)values(?,?,?);”);' – SteelToe

+0

请处理您的格式。 –

回答

4

您的SQL Developer会话和Java环境具有不同的NLS设置;一个预计日期为YYYY/MM/DD格式,另一个预定日期。你可以强制环境匹配,但是你不能总是能够控制它,最好不要依赖NLS设置。

你需要使用to_date()要么指定格式插入语句的一部分:

PreparedStatement prest = myConn.prepareStatement(
    "insert into QuickTicket (issueDate , pssngr_id , trip_number) values(to_date(?, 'YYYY/MM/DD'),?,?)") ; 

String s = "2016/12/25" ; 

prest.setString(1, s); 
... 

或者最好使用日期变量,并与setDate()设置它,而不是setString(),改变你的字符串to what valueOf() expects的格式作为JohnMatthewIanDavis指出:

PreparedStatement prest = myConn.prepareStatement(
    "insert into QuickTicket (issueDate , pssngr_id , trip_number) values(?,?,?)") ; 

String s = "2016-12-25" ; 

prest.setDate(1, java.sql.Date.valueOf(s)); 
... 

如果你实际上是试图插入当前日期,你可以得到从Java:

prest.setDate(1, new java.sql.Date(System.currentTimeMillis())); 

或从内甲骨文更简单地,使用sysdatecurrent_date(分别用于服务器时间和客户端时间,;在这种情况下,可能服务器):

PreparedStatement prest = myConn.prepareStatement(
    "insert into QuickTicket (issueDate , pssngr_id , trip_number) values(trunc(sysdate),?,?)") ; 

prest.setInt(1, passengerID); 
prest.setInt(2, tripID); 

trunc()设置插入值到午夜的时间。如果你想保持时间,只需使用普通的sysdate即可。

3

我猜issueDate是在你的数据库,一个Date类型,这意味着你要绑定一个日期,而不是一个字符串的

prest.setDate(1, java.sql.Date.valueOf(s)); 

代替

prest.setString(1, s); 

它应该工作。

+2

其实你必须将日期“2016/12/25”更改为“2016-12-25”。 –

+0

http://docs.oracle.com/javase/8/docs/api/java/sql/Date.html#valueOf-java.lang.String- –

+0

你钉住了它。我以为我会传递一个字符串,数据库会处理它。一大堆谢谢。 –