我试图从SQLite中提取最新的DateTime字段,并返回错误的时间。
数据库中的数据:
这是我通过LINQ获取最新DateTime的方法:
test.out();
问题是它没有返回预期的日期时间。我正在上午12点1分获得:
我做错了什么?
编辑:这是根据请求使用的提供商:https://components.xamarin.com/view/sqlite-net
编辑2:请求的SyncAudit类:
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();
}
}
答案 0 :(得分:1)
更改
public DateTime synctime {get;组; }
为:
公共日期时间? synctime {get;组; }
希望它会有所帮助。会发生什么是DateTime是非NULL数据类型,它强制在那里放置一个默认值(01/01/0001)以确保提交非空日期。不知道它是否是一个问题。 .try并检查
答案 1 :(得分:1)
当这个结果发生时,我查看了所有可能的情况。您的问题只有一个合理的解释。你的
db.Table<SyncAudit>()
是一个空集合,当您选择
时db.Table<SyncAudit>()
.OrderByDescending(c => c.SyncTime)
.Select(c => c.SyncTime)
.FirstOrDefault();
它会自然地返回DateTime的默认值。 检查数据库连接并确保它首先工作。
答案 2 :(得分:0)
要诊断出问题所在,请返回基础知识。将LINQ更改为foreach循环以迭代所有记录,并找到最大值。现在逐步完成代码(因为我怀疑它不会做你想要的)并且你会看到出了什么问题。然后告诉我们出了什么问题。
答案 3 :(得分:0)
我经常使用Select
与SQLite
一起使用此问题。我不知道问题究竟在哪里,但似乎延迟加载被破坏,所以当评估查询时,你最终得到默认值。我通过在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();
}
答案 4 :(得分:-1)
SQLite don't have special type for date and time,而是使用数字或文本来存储此类数据。 SQLiteConnection
构造函数有一个参数storeDateTimeAsTicks
,告诉您的提供商应该如何插入并存储日期和时间值。这是默认的。
所以也许SyncTime
作为文本而不是数字存储在数据库中。尝试通过将false
作为storeDateTimeAsTicks
传递来调整连接,以便提供商可以interpret data correctly:
var db = new SQLite.SQLiteConnection(this.DBPath, storeDateTimeAsTicks: false)