2015-07-10 63 views
15

我想從SQLite中拉出最近的DateTime字段,它返回的時間不正確。LINQ to SQL查詢不返回正確DateTime

這裏的數據庫中的數據:

enter image description here

這裏是我的方法通過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(); 
     } 
    } 

的問題是,它沒有返回預期約會時間。我得到1/1/0001上午12點:

enter image description here

我在做什麼錯?

編輯:這是正在使用的提供者,每個請求:https://components.xamarin.com/view/sqlite-net

編輯2:請求SyncAudit類別:

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

你的標題說 「的LINQ to SQL」 - 我想的LINQ to SQL只與SQL Server合作...你實際使用的LINQ提供者是什麼? –

+0

你是否有任何與syntime作爲空行,因爲值來的是默認datetime.min值 – Sachu

+1

它看起來像不正確的表或連接字符串。它找不到任何記錄並返回默認值。嘗試第一個,而不是FirstOrDefault,看看你是否得到像序列一樣的錯誤不包含元素或類似的東西.. –

回答

1

變化

公共的DateTime同步時間{獲得;組; }

到:

公衆的DateTime? synctime {get;組; }

希望它會有所幫助。會發生什麼是DateTime是不是NULL數據類型,它強制要在那裏設置一個默認值(01/01/0001),以確保非空日期將被提交。不知道它是否可以成爲一個問題..並檢查

+0

這會導致getLastSyncTime()方法中出現編譯錯誤。 IT表示現在還沒有SyncTime的定義。 –

+0

@DavidTunnel在表中該列可能處於非空模式 – Sachu

+0

請問您能表明一下你的意思嗎? –

-1

SQLite don't have special type for date and time,而是使用數字或文本來存儲此類數據。構造函數SQLiteConnection有一個參數storeDateTimeAsTicks,告訴你的提供者它應該如何插入和存儲日期和時間值。這是默認情況下。

因此,也許SyncTime作爲文本而不是數字存儲在您的數據庫中。試着調整連接,以便提供商可以通過interpret data correctly傳遞falsestoreDateTimeAsTicks

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

要診斷的問題是什麼,回到基礎。將LINQ更改爲foreach循環以迭代所有記錄,並找到最大值。現在單步執行代碼(因爲我懷疑它不會做你期望的),你會發現什麼地方出了問題。然後告訴我們什麼是錯的。

1

我看到了所有可能的情況,當這個結果可能發生。對你的問題只有一個合理的解釋。你

db.Table<SyncAudit>() 

是一個空集,當你選擇

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

自然會回報你的日期時間的默認值。 檢查您的數據庫連接並確保它首先工作。

0

我經常遇到這個問題,使用SelectSQLite。我不知道問題的實際位置,但看起來延遲加載已被破壞,因此在評估查詢時最終會獲取默認值。我通過在Select之前強制進行評估來解決此問題。這很煩人,但它的工作原理:

破碎例子(我自己):

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

這應返回的ints清單,但它最終返回一串0(默認值)。

固定例如:

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

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

你的榜樣(希望固定):

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