2010-02-26 3 views
5

J'ai un composant que je veux stocker dans une base de données SQLite.DateTime incorrect lors de l'ajout à la base de données SQLite via (Fluent) NHibernate

public class Comp : Entity 
{ 
    public virtual DateTime TimeStamp { get; set; } 
    public virtual String Name { get; set; } 
} 

public class CompMap : ClassMap<Comp> 
{ 
    public CompMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.TimeStamp); 
     Map(x => x.Name); 
    } 
} 

Rien d'extraordinaire.

Le problème est que le TimeStamp est correctement stocké dans la base de données (SQLite-Explorer affiche la valeur '30 -12 à 1899) Je pense qu'il a quelque chose à voir avec la façon dont NHibernate envoie le DateTime à la base de données

NHibernate: INSERT INTO "Comp" (TimeStamp, Name) VALUES (@p0, @p1); select last_insert_rowid(); @p0 = 26.02.2010 10:08:09, @p1 = 'test1' 

pour moi, il ressemble à la DateTime est dans un format de chaîne (peut-être juste la commande .ShowSQL() cependant) et SQLite ne peut pas gérer le format (c'est un formattage datetime allemand) J'ai essayé de changer le format à l'aide un IUserType mais le résultat est toujours le même.

Je n'ai trouvé personne d'autre ayant ce problème donc je suppose que le problème est dans mon code mais je suis incapable de le trouver.

Voici le TestCode j'utiliser pour initialiser le DB et insérez la valeur à la DB

using System; 
using System.IO; 
using ConsoleApplication1.db; 
using FluentNHibernate.Cfg; 
using FluentNHibernate.Cfg.Db; 
using NHibernate.Cfg; 
using NHibernate.Tool.hbm2ddl; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var sessionFactory = Fluently.Configure().Database(SQLiteConfiguration.Standard.UsingFile("test.db").ShowSql()) 
        .Mappings(m => m.FluentMappings.AddFromAssembly(typeof(Comp).Assembly)) 
        .ExposeConfiguration(config => 
              { 
               if (File.Exists("test.db")) 
               { 
                File.Delete("test.db"); 
               } 
               new SchemaExport(config) 
                .Create(false, true);             
              }) 
        .BuildSessionFactory(); 
      var session = sessionFactory.OpenSession(); 
      var ts = DateTime.Now; 
      Comp c = new Comp 
         { 
          Name = "test1", 
          TimeStamp = ts 
         }; 
      session.Save(c); 
      session.Flush(); 
      session.Close(); 
     } 
    } 
} 

Lors de l'exécution de cette commande et vérifier le contenu DB du TimeStamp ne pas la date/heure actuelle mais 1899- 31-12

Répondre

2

Il s'avère que c'était en effet ma faute, plus un profond manque de doublechecking. J'ai écrit le datetime dans la base de données, puis vérifié la valeur dans la base de données avec sqlite explorer. Apparemment, on a des problèmes avec les champs DateTime et présente une valeur incorrecte.

Cela, en plus du programme d'origine a eu un bug (le DateTime n'a pas été écrit correctement.

Ma conclusion à cet effet est: Ne pas utiliser l'explorateur sqlite

LinqPad ne montrent correctement la valeur et sera donc utilisé à partir de maintenant.

+1

SQlite développeur a le même problème que je viens de gaspiller 20 minutes de ma vie à essayer de comprendre –

1

Avez-vous essayé de changer la culture du fil en cours en quelque chose d'autre? InvariantCulture? Si cela respecte les paramètres régionaux qui pourraient aboutir à un format plus utilisable?

+0

Bon point. J'ai juste essayé ça. Il change la sortie en 'NHibernate: INSERT INTO" Comp "(TimeStamp, Name) VALEURS (@ p0, @ p1); select last_insert_rowid(); @ p0 = 02/26/2010 11:16:57, @ p1 = 'test1' malheureusement le contenu de la base de données ne change pas du tout (toujours le mauvais DateTime). – clows

0

Savez-vous quel type votre TimeStamp est dans la base de données? Sqlite n'a pas de type DateTime spécifique et peut les stocker en tant que texte, reals ou ints. Je ne sais pas comment le faire, mais pouvez-vous spécifier le type de colonne pour TimeStamp en tant que texte en quelque sorte.

Si vous avez exécuté que SQL sur votre base de données, que voulez-vous obtenir à savoir

INSERT INTO "Comp" (TimeStamp, Nom) VALUES (26.02.2010 10:08:09, 'test1');

Et que feriez-vous obtenir si vous exécutiez ceci:

INSERT INTO "Comp" (TimeStamp, Nom) VALUES ('26 .02.2010 10:08:09' , 'test1') ;

Il peut dépendre de la définition de la colonne si le dernier fonctionne ou non.

Questions connexes