2016-12-25 55 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

你釘住了它。我以爲我會傳遞一個字符串,數據庫會處理它。一大堆謝謝。 –