今天我通过使用ServiceStack ORMLite (在Windows 2012 Server,.NET Framework 4.0上进行测试)查询32位SQLite嵌入式数据库,遇到了一些奇怪的事情。
考虑以下测试查询:
var dateMinimum = DateTime.Now.Subtract(_doNotProcessQueueItemWhenOlderThanHours);
using (var db = DbConnectionFactory.OpenDbConnection())
{
var queueItemsTest1 = db.Select<ProcessQueue>(pc => (pc.Status == ProcessingStatus.Failed.ToString()) && (pc.DateCreated > dateMinimum)).ToList();
var queueItemsTest2 = db.Select<ProcessQueue>(pc => (pc.Status == ProcessingStatus.Failed.ToString())).ToList();
var queueItemsTest3 = db.Select<ProcessQueue>(pc => (pc.DateCreated > dateMinimum)).ToList();
var queueItemsUnparsed = db.Select<ProcessQueue>().ToList();
var queueItems = new List<ProcessQueue>();
foreach (var queueItemUnparsed in queueItemsUnparsed)
{
if ((queueItemUnparsed.Status == ProcessingStatus.Failed.ToString()) && (queueItemUnparsed.DateCreated > dateMinimum))
{
queueItems.Add(queueItemUnparsed);
}
}
}
public class ProcessQueue
{
[AutoIncrement]
public int Id { get; set; }
public DateTime DateCreated { get; set; }
public string Status { get; set; }
}
奇怪的是:
foreach
构造返回正确的行。 有没有办法记录数据库内部的内容?
我认为它与SQLite有关,因为我有另一个与SQL服务器对话的队列,这是有效的。我正在使用SQLite,因为必须嵌入此队列,并且找不到使ORMLite与SQL Compact一起工作的方法。
答案 0 :(得分:2)
有没有办法记录数据库内部的内容?
最简单的方法是使用Console.WriteLine(db.GetLastSql());
所以在你的情况下:
var queueItemsTest1 = db.Select<ProcessQueue>(pc => (pc.Status == ProcessingStatus.Failed.ToString()) && (pc.DateCreated > dateMinimum)).ToList();
Console.WriteLine(db.GetLastSql());
var queueItemsTest2 = db.Select<ProcessQueue>(pc => (pc.Status == ProcessingStatus.Failed.ToString())).ToList();
Console.WriteLine(db.GetLastSql());
var queueItemsTest3 = db.Select<ProcessQueue>(pc => (pc.DateCreated > dateMinimum)).ToList();
Console.WriteLine(db.GetLastSql());
然后,您应该能够使用SQL输出来确定它正在构建的查询。如果我冒险猜测我会说它与日期处理有关。
您无法使用DateTime
对象,因为SQLite不支持相应的格式。
SQLite没有预留用于存储日期和/或时间的存储类。相反,SQLite的内置日期和时间函数能够将日期和时间存储为TEXT,REAL或INTEGER值:
- TEXT as ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
- 真实的朱利安日数,即公元前4714年11月24日格林威治中午以来的天数。根据预感格里高利历。
- INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。
应用程序可以选择以任何格式存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换。
使用DateTime.Ticks
应该提供适当的long
。