【问题标题】:Filling a DataSet which contains a DateTime column with Sqlite Databases使用 Sqlite 数据库填充包含 DateTime 列的数据集
【发布时间】:2013-04-15 20:33:29
【问题描述】:

我正在开发一个使用 SQLite 数据库的 C# WPF 项目。我正在尝试从 sqlite 数据库中的表中检索数据并添加到数据集中,以便可以将数据集添加到数据网格的项目源中。其中一列是 DateTime 列,但出现以下错误:

String was not recognized as a valid DateTime.

下面是我如何检索数据

private DataSet getAlarmsForSqlite()
        {
            DataSet ds = new DataSet();
            try
            {
                using (ConnectSQLiteDatabase db = new ConnectSQLiteDatabase(dbPassword))
                {
                    string query = "SELECT * FROM alarms ORDER BY date";
                    SQLiteDataAdapter da = new SQLiteDataAdapter(query, db.conn);
                    da.Fill(ds);
                }

            }
            catch (SQLiteException ex)
            {
                Console.WriteLine("Failed to get alarms. Sqlite Error: {0}", ex.Message);
                return null;
            }
            return ds;
        }

下面是表的创建语句

CREATE TABLE `alarms` (`id` int(11) NOT NULL, `date` datetime NOT NULL,
`type` varchar(50) NOT NULL,
`message` mediumtext NOT NULL, 
`level` varchar(45) NOT NULL, 
`page` varchar(500) NOT NULL, 
`acknowledged` char(1) DEFAULT '0', PRIMARY KEY (`id`))

感谢您提供的任何帮助。

【问题讨论】:

  • 我不确定,但名为date 的那一列有点可疑。可以尝试用方括号封装吗?
  • 不确定您的意思,怀疑方括号以什么方式实现以及实现什么
  • 我怀疑这被解释为关键字,我的意思是SELECT * FROM alarms ORDER BY [date],实际上SQLite 想要在关键字周围加上双引号,但为了兼容性,方括号被接受并且易于编写sqlite.org/lang_keywords.html
  • 啊好吧,试过了,但还是没有运气。我不认为顺序是发生日期时间错误的原因
  • 您的代码看起来绝对合法,也许该列中有一些无效的日期时间。您可以尝试使用 DataReader 进行调试并遍历您的数据,直到出现错误。

标签: c# sqlite datetime


【解决方案1】:

试试这个方法

select *  from alarms order  by date(date) DESC

请参阅documentation

【讨论】:

    【解决方案2】:

    这里有一些关于这个问题的讨论; sqlite throwing a "String not recognized as a valid datetime"

    显然 SQLite 日期时间到 C# DateTime 序列化映射并不完全有效。对我来说,听起来日期时间会以字符串的形式返回,因此您需要在代码中执行 DateTime.Parse()。在该问题的一个答案中,它表明日期时间还需要转换为 nvarchar 才能正常工作。

    【讨论】:

    • 谢谢,但我认为这没有帮助,因为他们正在处理结果集的问题,因此他们可以操纵我没有做的每个字段,因为我只是将整个结果集放入数据集
    • 我还没有处理过 C# 中的数据集,但您是否仍然需要创建某种合约?像第 1 列是类型 a 并映射到我的数据集的第 1 列?如果是这种情况,我敢打赌你可以强制那里的价值。其他 .NET 序列化方法(例如 Entity Framework)提供了这些功能,所以我认为数据集可能也有这些功能。
    【解决方案3】:

    这是两件事之一:

    • 你表中的数据实际上是 SQLite 不是的格式 能够变成日期时间。为获得最佳效果,请使用 ISO8601 日期格式“yyyy-MM-dd HH:mm:ss.FFFFFFF”。这个需要 在将数据写入数据库之前进行转换,但是 在将数据读回数据集时进行透明处理。

    • 您的查询中的 ORDER BY 术语由于某种原因阻止了 SQLiteDataAdapter 从识别正确的类型 柱子。即使您按其他列排序,结果也会是 相同。为避免此问题,请删除订购项(这将 然后正确识别列数据类型)并对数据集进行排序 填满后。

    编辑:在查看了 Ramesh 的建议后,当使用带有 Order By 的“日期”功能时,我在第二点中概述的行为不再发生。

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多