2015-07-10 13 views
15

Sto cercando di estrarre il campo DateTime più recente da SQLite e restituisce l'ora non corretta.LINQ alla query SQL che non restituisce corretta DateTime

Ecco i dati nel database:

enter image description here

Ed ecco il mio metodo per ottenere il più recente DateTime via LINQ:

public string getLastSyncTime() 
    { 
     using (var db = new SQLite.SQLiteConnection(this.DBPath)) 
     { 
      var query = db.Table<SyncAudit>() 
         .OrderByDescending(c => c.SyncTime) 
         .Select(c => c.SyncTime) 
         .FirstOrDefault(); 

      return query.ToString(); 
     } 
    } 

Il problema è che non sta tornando l'atteso appuntamento. Io sono sempre 1/1/0001 12:00:

enter image description here

Che cosa sto facendo di sbagliato?

EDIT: questo è il provider utilizzato, per richiesta: https://components.xamarin.com/view/sqlite-net

Edit 2: Richiesto SyncAudit Classe:

class SyncAudit 
{ 
    public string Server { get; set; } 
    public string Database { get; set; } 
    public DateTime SyncTime { get; set; } 
    public int Successful { get; set; } 
} 
+0

Hai detto "LINQ to SQL" nel titolo - ho pensato che LINQ to SQL solo ha lavorato con SQL Server ... quale fornitore LINQ stai usando? –

+0

hai una qualsiasi riga con syntime come null perché il valore che arriva è il valore predefinito datetime.min – Sachu

+1

Sembra una tabella errata o una stringa di connessione. Non riesce a trovare alcun record e restituisce il valore predefinito. Provare prima invece di FirstOrDefault e vedere se si ottiene errore come la sequenza non contiene elementi o qualcosa del genere .. –

risposta

1

Change

DateTime synctime pubblico {get; impostato; }

a:

DateTime pubblico? synctime {get; impostato; }

Spero che possa essere d'aiuto. Quello che succede è DateTime NON è il tipo di dati NULL e impone di inserire un valore predefinito lì (01/01/0001) per assicurarsi che la data non nullo sarà inviata. Non so se può essere un problema ... e controllare

+0

Ciò comporta un errore di compilazione nel metodo getLastSyncTime(). IT dice che ora non esiste una definizione per SyncTime. –

+0

@DavidTunnel nella tabella quella colonna potrebbe in modalità notnull – Sachu

+0

Puoi per favore mostrare cosa intendi? –

-1

SQLite don't have special type for date and time, invece utilizzare il numero o il testo per memorizzare tali dati. Il costruttore SQLiteConnection ha un parametro storeDateTimeAsTicks che indica al provider come deve essere memorizzato e memorizza i valori di data e ora. È vero per impostazione predefinita.

Quindi forse SyncTime viene archiviato nel database come testo anziché come numero. Cercare di regolare connessione in modo provider può interpret data correctly passando false come storeDateTimeAsTicks:

var db = new SQLite.SQLiteConnection(this.DBPath, storeDateTimeAsTicks: false) 
0

Per diagnosticare quale sia il problema, tornare alle origini. Cambiare il LINQ in un ciclo foreach per iterare su tutti i record e trovare il valore più grande. Ora passa attraverso il codice (perché sospetto che non farà quello che ti aspetti) e vedrai cosa non va. Allora dicci cosa c'era che non andava.

1

Ho esaminato tutti gli scenari possibili quando questo risultato può verificarsi. C'è solo una spiegazione logica al tuo problema. Il tuo

db.Table<SyncAudit>() 

è un insieme vuoto e quando si seleziona

db.Table<SyncAudit>() 
        .OrderByDescending(c => c.SyncTime) 
        .Select(c => c.SyncTime) 
        .FirstOrDefault(); 

sarà naturalmente si restituire valore di default del DateTime. Controlla la connessione al tuo database e assicurati che funzioni prima.

0

Ho spesso questo problema utilizzando Select con SQLite. Non so dove sia effettivamente il problema, ma sembra che il caricamento pigro sia interrotto e quindi si ottengono valori predefiniti al momento di valutare la query. Risolvo questo forzando la valutazione prima del Select. E 'fastidioso ma funziona:

rotto esempio (il mio):

 using (var db = new SQLiteConnectionWithLock(base.DatabasePath)) 
     { 
      return db.Table<VideoUploadChunk>() 
       .Where(c => c.VideoId == videoId) 
       .Select(c => c.ChunkNumber) 
       .ToList(); 
     } 

Questo dovrebbe restituire un elenco di ints, ma finisce per restituire un po' di 0 di (impostazione predefinita).

esempio fisso:

 using (var db = new SQLiteConnectionWithLock(base.DatabasePath)) 
     { 
      var result = db.Table<VideoUploadChunk>() 
       .Where(c => c.VideoId == videoId) 
       .ToList(); 

      return result.Select(c => c.ChunkNumber); 
     } 

Il vostro esempio (si spera fisso):

using (var db = new SQLite.SQLiteConnection(this.DBPath)) 
    { 
     var query = db.Table<SyncAudit>() 
        .OrderByDescending(c => c.SyncTime) 
        .FirstOrDefault(); 

     return query.Select(c => c.SyncTime).ToString(); 
    } 
Problemi correlati