2010-07-12 5 views
5

J'ai créé une table appelée "myTable" avec une colonne appelée CURRENT_DATE et son type de données est "DATE". Lorsque je mets à jour ma table par programmation, je souhaite également placer un horodatage ou une date système dans le champ CURRENT_DATE. Une partie de ce que je fais est montrée ci-dessous, mais cela ne fonctionne pas. Je pense que ce serait facile, mais ... Pouvez-vous m'aider?Date SQL du système INSERT dans la table

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

Répondre

8

Vous devriez vraiment le faire comme une instruction préparée en utilisant des paramètres, cela rend les choses beaucoup plus faciles et élimine quelques menaces d'injection SQL très simples.

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

Il existe de nombreuses informations sur l'utilisation correcte des instructions préparées. Par exemple: http://www.jdbc-tutorial.com/jdbc-prepared-statements.htm

3

Si vous voulez juste la date actuelle, vous pouvez la récupérer du serveur SQL, sans l'envoyer en tant que variable. Cela varie un peu selon le serveur que vous utilisez, mais dans MS SQL Server, il existe une fonction appelée getdate().

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

Vous pouvez également définir getdate() comme la valeur par défaut pour ce champ, de sorte que vous pouvez omettre le champ entièrement:

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

Beat me - nice answer +1 –

0

Essayez ceci:

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

Pour l'intégrité des données, c'est quelque chose qui devrait être fait à la fin du SGBD avec un déclencheur de mise à jour et d'insertion.

Toute autre méthode peut être obtenue par un code malveillant (ou bogué).

Comment obtenir la valeur réelle (et comment créer les déclencheurs appropriés) dépend du SGBD lui-même. DB2 fournit current date, current time et current timestamp que vous pouvez utiliser pour insérer l'heure du serveur dans la base de données, ce qui est susceptible d'être plus cohérent que des centaines d'heures client différentes.

2

Ne placez pas de chaînes dans le SQL. Utilisez une instruction préparée et définissez les paramètres.

+1

+1 pour la seule réponse non vulnérable aux attaques par injection SQL – krock

+0

Cela devrait être un commentaire, car il est totalement périphérique à la question posée. Mais cela étant dit, je suis d'accord, bien sûr =) –

+0

@David Hedlund: ce n'est pas périphérique: mettre une date rendue en chaîne directement dans SQL pourrait être mal interprété par le SGBD, parce que vous ne connaissez pas le SGBD que le code interroge réellement . – onof

Questions connexes