2010-07-12 29 views
5

我創建了一個名爲「myTable」的表,名爲CURRENT_DATE的列,它的數據類型是「DATE」。當我以編程方式更新我的表時,我也想在CURRENT_DATE字段中放置時間戳或系統日期。我正在做的一部分顯示如下,但它不起作用。我會認爲這很容易,但是......你能幫忙嗎?SQL INSERT系統日期到表

//System date is captured for placement in the CURRENT_DATE field in myTable 
java.util.Date currentDate = new java.util.Date(); 
... 
stmt.executeQuery("INSERT INTO myTable (NAME, CURRENT_DATE) VALUES (' " + userName + " ', ' " + currentDate + " ') ");  

回答

8

你真的應該這樣做,作爲使用參數的準備語句,它使事情變得容易很多,並刪除了一些非常簡單的SQL注入威脅。

Connection con = ...; 
PreparedStatement statement = con.prepareStatement("INSERT INTO myTable (NAME, CURRENT_DATE) VALUES (?, ?)"); 
statement.setString(1, userName); 
statement.setDate(2, currentDate); 
statement.execute(); 

關於如何正確使用準備好的語句有很多信息。例如:http://www.jdbc-tutorial.com/jdbc-prepared-statements.htm

3

如果您只是想要當前日期,您可以從SQL服務器中檢索該日期,而無需將其作爲變量提交。這取決於您使用的服務器有所不同,但在MS SQL Server中有一個稱爲getdate()的功能。

stmt.executeQuery("INSERT INTO myTable (NAME, CURRENT_DATE) VALUES (' " + userName + " ', getdate()");  

您還可以設置getdate()作爲該字段的默認值,這樣就可以完全忽略的領域:

stmt.executeQuery("INSERT INTO myTable (NAME) VALUES (' " + userName + " '" ') ");  
+0

打我 - 很好的答案+1 – 2010-07-12 06:50:32

0

試試這個:

stmt.executeQuery("INSERT INTO myTable (NAME, CURRENT_DATE) VALUES (' " + userName + " ', GETDATE()) "); 
0

對於數據的完整性,這是應該在DBMS端以更新和插入觸發器完成的事情。

任何其他方法都可以通過惡意代碼獲得。

如何獲取實際值(以及如何創建適當的觸發器)取決於DBMS本身。 DB2提供了current date,current timecurrent timestamp,您可以使用它們將服務器時間插入數據庫,這可能比數百個不同的客戶端時間更加一致。

2

不要在SQL中放入字符串。使用準備好的語句並設置參數。

+1

+1對於不容易受到SQL注入攻擊的唯一答案 – krock 2010-07-12 06:53:07

+0

這應該是一個評論,因爲它完全是被問到的問題的外圍。但是我說,我同意當然=) – 2010-07-12 07:14:13

+0

@David Hedlund:它不是外設:將日期直接放入SQL中的日期可能會被DBMS誤解,因爲您不知道代碼實際上正在查詢的DBMS 。 – onof 2010-07-12 07:21:35