Servicestack - 在SQLite32数据库上按日期查询OrmLite不会返回任何结果

时间:2014-01-21 22:13:44

标签: sqlite datetime servicestack ormlite-servicestack

今天我通过使用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; }
}

奇怪的是:

  • queueItemsTest1不返回任何内容
  • queueItemsTest2返回所有正确的行
  • queueItemsTest3不返回任何内容
  • foreach构造返回正确的行。

有没有办法记录数据库内部的内容?

我认为它与SQLite有关,因为我有另一个与SQL服务器对话的队列,这是有效的。我正在使用SQLite,因为必须嵌入此队列,并且找不到使ORMLite与SQL Compact一起工作的方法。

1 个答案:

答案 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 documentation

  

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