【问题标题】:Convert SQLite timestamp to DateTime in C#在 C# 中将 SQLite 时间戳转换为 DateTime
【发布时间】:2021-01-04 21:09:12
【问题描述】:

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

【问题讨论】:

  • 如果该列定义为实际的 TIMESTAMP,SQLIte 应该能够将其转换为 NET DateTime。目前尚不清楚为什么将其视为字符串。见SQLite not storing decimals correctly
  • 您的 Ticket 课程是什么样的?特别是 OpenDate
  • 我最初将 SQL 列设置为时间戳,但在阅读了 SQLite 的文档后,它看起来不支持时间作为数据类型,它只是文本类型。这是我要写的票类中的属性: public DateTime OpenDate { get;放; }
  • 如果我将其设置为字符串类型也会引发异常。
  • 我将列数据类型改回 TIMESTAMP,没有变化。 CommentTime TIMPSTAMP, OpenDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ClosedDate TIMESTAMP

标签: c# sql datetime timestamp system.data.sqlite


【解决方案1】:

所以我发现了问题。

我使用 SQLite 的 TIMESTAMP 作为默认列值,我允许在每次插入时为列值设置它。我编辑了 C# 插入行以插入 DateTime.Now。是的,SQLite 支持 TimeStamp 作为一种数据类型,但文档说它实际上是作为字符串存储的。 See the documentation

经过多次故障排除后,我意识到我的列号混淆了,我试图导入 parse a bool as time,这显然会引发异常。我现在正在重写我的代码,使其更具动态性,以避免将来出现此类问题。

最后我最终使用ticket.OpenDate = DateTime.Parse(rdr.GetString(6)); 这一行成功地将列值分配给DateTime 属性。我的想法是,如果 SQLite 将其存储为字符串,我应该将其作为字符串检索并将其解析为 DateTime。我还将值存储为 C# 中的本机 DateTime 值,而不是依赖 SQLite 中的 TimeStamp 值。不过,我还没有测试是否可以解析 TimeStamp 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 2019-12-24
    • 2011-12-18
    • 2020-09-11
    • 1970-01-01
    • 2022-01-24
    • 2012-11-09
    • 1970-01-01
    相关资源
    最近更新 更多