问题描述
我正在尝试为对象的属性分配包含sqlite中时间戳的列的值。目前,该属性的类型为DateTime,但是我尝试了不变的字符串类型。我尝试使用Convert.ToDateTime(rdr.GetString(5).ToString())
且没有任何更改。
这是我得到的例外:
system.invalidCastException: Specified cast is not valid.
at System.Data.sqlite.sqliteDataReader.VerifyType(Int32 i,DbType typ)
at System.Data.sqlite.sqliteDataReader.GetDateTime(Int32 i)
at ConsoleHelpTicket.Data.FillQueue(sqliteConnection conn,Queue`1 queue) in E:\...\Data.cs:line 142
这是属性声明:
public DateTime OpenDate { get; set; }
这是我尝试分配作业的方法:
public static void FillQueue(sqliteConnection conn,Queue<Ticket> queue)
{
try
{
var cmd = new sqliteCommand($"select * from Tickets order by OpenDate desc;",conn);
using sqliteDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Ticket ticket = new Ticket();
ticket.Tid = rdr.GetInt32(0);
ticket.Title = rdr.GetString(2);
ticket.Description = rdr.GetString(3);
ticket.OpenDate = rdr.GetString(5); <---------- PROBLEM LINE
ticket.ClosedDate = rdr.GetString(6);
ticket.Open = rdr.GetBoolean(7);
ticket.Location = rdr.GetString(8);
System.Console.WriteLine($"Added TID: {rdr.GetInt32(0)} Title: {rdr.GetString(2)} to queue.");
queue.Enqueue(ticket);
}
}
解决方法
所以我找出了问题所在。
我使用SQLite的TIMESTAMP作为默认列值,并且允许在每次插入时为列值设置该值。我编辑了C#插入行以插入DateTime.Now
。是的,SQLite支持TimeStamp作为数据类型,但是文档说它确实存储为字符串。 See the documentation
经过大量的故障排除后,我意识到我弄混了我的列号,并且我试图将解析布尔值作为时间导入,这显然会引发异常。我现在正在重新编写代码,使其更具动态性,以避免将来出现此类问题。
最后,我最终使用了此行ticket.OpenDate = DateTime.Parse(rdr.GetString(6));
来成功地将列值分配给DateTime
属性。我的想法是,如果SQLite将其存储为字符串,则应将其检索为字符串并将其解析为DateTime
。我还将值存储为C#的本机DateTime
值,而不是依赖SQLite的TimeStamp
值。我尚未测试过是否可以解析TimeStamp
值。