2010-07-12 7 views
5

He creado una tabla llamada "myTable" con una columna llamada CURRENT_DATE y su tipo de datos es "DATE". Cuando actualizo programáticamente mi tabla, también deseo colocar una fecha y una fecha del sistema en el campo CURRENT_DATE. Una parte de lo que estoy haciendo se muestra a continuación, pero no está funcionando. Pensaría que esto sería fácil, pero ... ¿Puedes ayudar?SQL INSERT fecha del sistema en la tabla

//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 + " ') ");  

Respuesta

8

Realmente debería estar haciendo esto como una declaración preparada usando parámetros, hace las cosas mucho más fáciles y corta algunas amenazas de inyección SQL muy simples.

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

Hay mucha información sobre cómo usar declaraciones preparadas correctamente. Por ejemplo: http://www.jdbc-tutorial.com/jdbc-prepared-statements.htm

3

Si solo desea la fecha actual, puede recuperarla del servidor SQL, sin enviarla como una variable. Varía un poco dependiendo del servidor que esté usando, pero en el servidor MS SQL hay una función llamada getdate().

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

También puede establecer getdate() como el valor por defecto del campo, por lo que se puede omitir el campo completo:

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

Beat me - nice answer +1 –

0

Prueba esto:

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

Para integridad de los datos, esto es algo que se debe hacer en el extremo del DBMS con una actualización y un activador de inserción.

Cualquier otro método se puede evitar con código malicioso (o defectuoso).

Cómo obtener el valor real (y cómo crear los desencadenadores apropiados) depende del propio DBMS. DB2 proporciona current date, current time y current timestamp que puede utilizar para insertar la hora del servidor en la base de datos, que es probable que sea más consistente que cientos de veces de cliente diferentes.

2

No coloque cadenas en el SQL. Use una declaración preparada y establezca parámetros.

+1

+1 para la única respuesta no vulnerable a los ataques de inyección SQL – krock

+0

Esto debería ser un comentario, ya que es totalmente periférico a la pregunta que se hace. Pero una vez dicho esto, estoy de acuerdo, por supuesto =) –

+0

@David Hedlund: no es periférico: el DBMS puede malinterpretar poniendo una fecha a la cadena directamente en SQL, porque no sabes el DBMS que ese código está realmente consultando . – onof

Cuestiones relacionadas