在C#中将SQLite时间戳转换为DateTime

如何解决在C#中将SQLite时间戳转换为DateTime

我正在尝试为对象的属性分配包含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值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?