【发布时间】: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