sqlite抛出“字符串未被识别为有效的日期时间”

时间:2012-07-10 13:29:54

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

我正在玩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()来查看发生了什么,但我一直得到同样的错误。我可以很好地阅读文本字段,但无法读取日期字段。

我的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( );

非常感谢任何帮助。

此致

4 个答案:

答案 0 :(得分:26)

根据this thread中的讨论,我决定使用" datetimeformat"构建我的连接字符串。参数和"字符串未被识别为有效日期时间"问题已经解决。

我的示例连接字符串:

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

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

答案 1 :(得分:9)

这个帖子可能有点旧,但我遇到了同样的问题并找到了一个&#34;解决方案&#34;。

System.Data.SQLite似乎无法正确处理DateTime。我尝试了DateTime.ParseExact并在我的数据库中提供了格式(mm / dd / yyyy),但我注意到只是在ToString()列上调用DataReader日期时出现了错误。这似乎很奇怪,因为我没有尝试将其放入Date但是将其读作String

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

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

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

答案 2 :(得分:2)

select strftime('%m/%d/%Y',substr(colName,0,20)) from tablename

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

答案 3 :(得分:0)

更改连接字符串对我来说不起作用,但是触发提示帮助我以这种方式使用

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