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.
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();
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.
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
.
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());
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 .
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