2010-02-26 4 views
5

Mam komponent, który chcę przechowywać w bazie danych SQLite.Nieprawidłowe ustawienie DateTime po dodaniu do SQLite DB przez (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); 
    } 
} 

Nic nadzwyczajnego.

Problemem jest to, że TimeStamp jest nieprawidłowo przechowywane w dB (SQLite-Explorer pokazać wartość '30 -12-1899') myślę, że to ma coś wspólnego ze sposobem nHibernate wysyła DateTime do bazy

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

dla mnie to wygląda jak DateTime jest w formacie String (może być po prostu komendę .ShowSQL() chociaż) i SQLite nie obsługuje formatu (jest to niemiecki datetime formatowanie) próbowałem zmienić format za pomocą IUserType, ale wynik jest wciąż taki sam.

Nie znalazłem nikogo innego o tym problemie, więc zakładam, że problem jest w moim kodzie, ale nie mogę go znaleźć.

Oto testcode używać do zainicjowania DB i wstawić wartość do 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(); 
     } 
    } 
} 

Podczas wykonywania tego polecenia i sprawdzając zawartość DB datownik nie posiada aktualną datę/czas, ale 1899- 31-12

Odpowiedz

2

Okazało się, że to była rzeczywiście moja wina plus głęboki brak podwójnego sprawdzania. Zapisałem datetime w bazie danych, a następnie sprawdziłem wartość w bazie danych pod numerem sqlite explorer. Wygląda na to, że ma problemy z polami DateTime i przedstawia niepoprawną wartość.

To plus oryginalny program miał błąd (DateTime nie został napisany poprawnie.

Moja konkluzja jest do nich: Nie należy używać SQLite Explorer

LinqPad nie poprawnie wyświetlić wartości, a tym samym będą wykorzystywane od teraz.

+1

SQlite programista ma ten sam problem, który zmarnowałem 20 minut mojego życia, próbując dowiedzieć się –

1

Czy próbowałeś zmienić kulturę bieżącego wątku na coś innego? InvariantCulture? Gdyby to respektować ustawienia narodowe, które mogą skutkować bardziej użytecznym formatem?

+0

Dobra uwaga. Właśnie tego próbowałem. Zmienia wyjście na 'NHibernate: INSERT INTO" Comp "(TimeStamp, Name) VALUES (@ p0, @ p1); select last_insert_rowid(); @ p0 = 02/26/2010 11:16:57, @ p1 = 'test1'' Niestety, zawartość DB nie zmienia się w ogóle (nadal jest to niewłaściwy DateTime). – clows

0

Czy wiesz, jaki typ TimeStamp znajduje się w bazie danych? Sqlite nie ma określonego typu DateTime i może przechowywać je jako text, real lub ints. Nie wiem jak to zrobić, ale czy możesz określić typ kolumny dla TimeStamp jako tekst w jakiś sposób.

Jeśli biegł że SQL w bazie danych, co można dostać tj

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

A potem co można dostać, jeśli prowadził ten:

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

Może zależeć od definicji kolumny, czy późniejsze prace, czy nie.

Powiązane problemy