web-dev-qa-db-fra.com

Java: Insérer dans une table datetime

J'essaie d'insérer dans une variable de la base de données MS-SQL la date et l'heure actuelles ..__ J'utilise ce format: 

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
Calendar cal = Calendar.getInstance();  
System.out.println(dateFormat.format(cal.getTime()));

et je reçois ce résultat 2013-01-28 09: 29: 37.941

Mon champ dans la base de données est défini datetime et comme je l'ai vu dans d'autres tables qui ont le même champ, la date et l'heure sont écrites exactement comme ceci: 2011-07-05 14: 18: 33.000.

J'essaie d'insérer dans la base de données avec une requête que je fais dans un programme Java, mais j'obtiens cette erreur

Exception SQL: Etat: S0003 Message: Conversion d'un varchar type de données à un type de données datetime de la valeur est hors limites. Erreur : 242

Ma requête est comme ça: 

query = "INSERT INTO Companies CreatedOn"+ 
         "VALUES ('" + dateFormat.format(cal.getTime()) + "')"

mais je ne comprends pas ce que je fais mal.

8
Dimitra Micha

Selon la description de error , vous insérez un type incorrect dans la base de données. Voir JDBC à MSSQL . Vous devez convertir Calendar en Timestamp .

Essayez d'utiliser:

PrepareStatement statement 
    = connection.prepareStatement("INSERT INTO Companies CreatedOn VALUES(?)");
Java.sql.Timestamp timestamp = new Java.sql.Timestamp(cal.getTimeInMillis());
statement.setTimestamp(1, timstamp);
int insertedRecordsCount = statement.executeUpdate();
17
Taky

Tout d'abord, n'utilisez PAS la concaténation de chaînes. Avez-vous déjà eu le coeur de injection SQL ?

La bonne façon de faire est d’utiliser une déclaration préparée:

L'idée est que vous définissiez une instruction avec des espaces réservés et que vous définissiez une valeur pour ces espaces réservés.

Voir la réponse de @Taky ' s pour plus de détails.

3
Betlista

dateFormat#format cette méthode retourne une chaîne formatée et non un objet Date. Le champ de la base de données est DateTime et il s'attend à ce que Java.sql.Timestamp y soit inséré et non pas String selon docs

Pour se conformer à la définition de SQL DATE, les valeurs en millisecondes encapsulé par une instance Java.sql.Date doit être "normalisé" en définissant les heures, minutes, secondes et millisecondes à zéro dans le fuseau horaire particulier auquel l'instance est associée.

Essayez l'objet Java.sql.Timestamp au lieu de String dans la requête et je vous recommanderais d'utiliser PreparedStatement

1

Si vous souhaitez stocker la date et l'heure actuelles, vous devez utiliser MYSQL méthode intégrée NOW () . Pour une brève documentation, consultez http://dev.mysql.com/doc /refman/5.5/en/date-and-time-functions.html . alors votre code sera comme.

INSERT INTO Companies CreatedOn VALUES(NOW())"

Cependant, si vous voulez le faire en utilisant Java Date-util, il devrait être

Calendar cal = Calendar.getInstance(); 
Java.sql.Timestamp timestamp = new Timestamp(cal.getTimeInMillis());
0
arvin_codeHunk

Vous pouvez utiliser Joda framework pour travailler avec date/heure . Il mappe ses propres types date/heure aux types Hibernate/SQL sans problème . Lorsque vous définissez des paramètres dans une requête HQL, joda effectue un mappage de type correct .

0
Denys

En effet, vous essayez de sauvegarder la valeur de date String dans le champ Base de données de type Date.

convertissez-le en DataType 

Vous pouvez également utiliser le format datetime "unseparated" yyyymmdd hh:mm:ss

0
TheWhiteRabbit