【问题标题】:sqlite throwing a "String not recognized as a valid datetime"sqlite 抛出“字符串未被识别为有效日期时间”
【发布时间】:2012-07-09 23:50:43
【问题描述】:

我正在使用 Sqlite 并在尝试回读一些测试数据时不断收到错误消息。例如,我创建了一个简单的数据库,其中包含一个表和一些列,并用一些测试数据填充它,如下所示。

sqlite> .schema
CREATE TABLE "shows"(id integer primary key asc autoincrement, showName TEXT, guest TEXT, dateAired date, dateWatched date);

sqlite> select * from shows;
6|test show|test guest 1|2012.05.01|2012.07.10
7|test show|test guest 2|2012.05.02|2012.07.10
8|test show|test guest 4|2012.05.04|2012.07.10

我正在使用 here 可用的 System.Data.Sqlite 库,但在尝试读取日期列时它一直给我一个错误。我尝试将日期设置为 dd-MM-yyyy 格式,但仍然收到错误消息“字符串未被识别为有效日期时间”。我曾尝试使用 DateTime.Parse 或将其转换为 datetime 或只是 ToString()'ing 来查看会发生什么,但我一直收到同样的错误。我可以很好地阅读文本字段,但无法阅读日期字段。

我的 C# 代码如下所示

var sqliteConn = new SQLiteConnection("Data Source=data/shows.db;Version=3;New=False;Compress=True");
sqliteConn.Open();
SQLiteCommand cmd = new SQLiteCommand(sqliteConn);
cmd.CommandText = "select * from shows";

SQLiteDataReader reader = cmd.ExecuteReader( );
while (reader.Read( ))
    {
    var showName = reader["showName"];
    // This is where it keeps giving me an error.
    // I have tried various things such as DateTime.Parse
    var airedDate = DateTime.ParseExact("yyyy.MM.dd", reader["dateAired"].ToString(), new CultureInfo("en-AU"));
     }
reader.Close( );

任何帮助将不胜感激。

问候,

【问题讨论】:

    标签: c# .net database sqlite datetime-format


    【解决方案1】:

    基于this thread 中的讨论,我决定使用“datetimeformat”参数构造我的连接字符串,并解决了“String Not Recognized as a valid datetime”问题。

    我的示例连接字符串:

    source=<source to db file>;version=3;new=False;datetimeformat=CurrentCulture
    

    此功能于 2013 年 7 月 8 日在版本 1.0.87.0 中发布(请参阅release notes

    【讨论】:

    • 我认为 C# SQlite 包装器中存在错误,默认日期时间格式为 ISO8601,但强制使用 CurrentCulture 效果很好。
    • 您使用的是哪个版本的 system.data.sqlite,我尝试了 CurrentCulture,但我收到错误 Requested value 'CurrentCulture' was not found.
    • CurrentCulture 对我不起作用。 Ticks 解决了这个问题。
    • @erichoxworth 使用您的附加参数,我基本上解决了这个问题。唯一的问题是一些奇怪的内容,比如“\N”而不是真实日期。我没有找到其他解决方案,然后尝试...抓住它。
    【解决方案2】:

    这个帖子可能有点老了,但我遇到了同样的问题并找到了一个“解决方案”。

    System.Data.SQLite 似乎没有正确处理DateTimes。我尝试了DateTime.ParseExact 并在我的数据库中给出了格式(mm/dd/yyyy),但我注意到它在DataReader 列上调用ToString() 时抛出了一个错误。这看起来很奇怪,因为我没有尝试将其放入 Date 中,而是将其读出为 String

    因此,我返回到从数据库调用的视图,并将所有日期都包含在 CAST as nvarchar(10) 中。这样,数据库将返回字符串而不是日期。现在,DateTime.Parse 工作正常!

    我将在视图上使用触发器将字符串/日期拉回并插入/更新基础表,从而使所有转换都发生在数据库中,而不是 System.Data.SQLite。

    有一个新版本的 System.Data.SQLite 将于 2012 年 12 月的某个时候推出,我希望这个问题得到解决!

    【讨论】:

    • 谢谢,我有同样的问题,它解决了错误
    • SQLite 解决了这个问题吗?我无法更改数据库的 DateTime 格式,所以问题仍然存在。当用户在 Windows 操作系统上更改日期时间格式时,我的应用程序崩溃。 :( 我的 SQLite 版本是 3.15.1.0,我正在开发一个 Windows 8.1 商店应用程序。)谢谢。
    【解决方案3】:
    select strftime('%m/%d/%Y',substr(colName,0,20)) from tablename
    

    这可行,我已经测试过了,因为 sqlite 中的内置函数将字符串转换为日期时间格式

    【讨论】:

      【解决方案4】:

      更改连接字符串对我不起作用,但触发想法帮助我以这种方式使用它

      "Select Cast("Coulname" as nvarchar(20)) From "Table Name"

      【讨论】:

        【解决方案5】:

        错误“字符串未被识别为有效的日期时间。”

        将您的系统日期时间格式更改为您的数据库文件日期时间格式。

        希望对你有帮助....

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-24
          • 1970-01-01
          • 2013-02-07
          • 2011-10-21
          • 2017-08-03
          相关资源
          最近更新 更多