16

我试图读出一个示例 Northwind sqlite 数据库,但在某些带有日期时间的表上出现错误。这是数据库的问题还是我的 System.Data.SQLite 的问题?异常类似于:“字符串不是有效的日期时间”

http://system.data.sqlite.org/

当然,我可以通过正确转换日期时间自己读出数据,但这不如通过简单的 dt.Load()

        SQLiteCommand dbCommand = myConnector.CreateCommand();
        dbCommand.CommandText = "SELECT * FROM " + tablename;

        SQLiteDataReader executeReader = dbCommand.ExecuteReader(CommandBehavior.SingleResult);
        DataTable dt = new DataTable();
        dt.Load(executeReader); // <-- FormatException

" 北 System.DateTimeParse.ParseExactMultiple(String s, String[] 格式, DateTimeFormatInfo dtfi, DateTimeStyles 样式)\r\n 北 System.DateTime.ParseExact(String s, String[] 格式, IFormatProvider 提供程序, DateTimeStyles 样式)\r\ n bei System.Data.SQLite.SQLiteConvert.ToDateTime(String dateText, SQLiteDateFormats format, DateTimeKind kind) in c:\dev\sqlite\dotnet\System.Data.SQLite\SQLiteConvert.cs:Zeile 322."

我需要一个很好的帮助来改进当前的代码。

4

3 回答 3

13

是的,我遇到了同样的问题,我已经找到了解决方案。

首先你需要知道它为什么会发生。

http://www.sqlite.org/datatype3.html

**

SQLite 没有为存储日期和/或时间预留存储类。相反,SQLite 的内置日期和时间函数能够将日期和时间存储为 TEXT、REAL 或 INTEGER 值:

**

TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC. 

应用程序可以选择以任何这些格式存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换。

有关更多日期/时间功能,您可以查看此页面: http ://www.sqlite.org/lang_datefunc.html

解决方案:

只是使用 datetime 函数将您的字段转换为有效的 .NET 数据表格式。您可以使用上述链接中的任何人,就我而言,我选择:

SELECT datetime(field) as field FROM table

提示 1 如果您的查询是在一个视图上,并且您不能触摸您的数据库、创建一个不同的视图或类似的东西,那么您会遇到一些麻烦,因为正如我之前解释的那样,问题出在数据库方面。所以第一个解决方案是在加载之前替换数据表的列(有点脏工作)。或者,您可以在文本字段上使用 Unix 标记或任何所需的时间戳。但我认为最好的解决方案是从您的角度在您的应用程序上创建查询:

SELECT datetime(field) as field FROM view

提示 2

您也可以尝试使用 SQLite 管理员并在检查格式之前使用日期时间函数。

提示 3

还要注意你的文化全球化,如果你改变文化,你会发现问题。尝试只用一个来完成你的软工作,并按照你的意愿展示它,而不是按照文化的意愿展示它。例如,在我的国家,我们通常使用这种格式:dd/MM/yy,这很痛苦,就像十进制数字上的点(我们使用逗号)

提示 4

如果您在某些报表或实体或类似的东西上使用向导定义的连接,请务必检查您所需的转换格式。例如我使用最常见且没有问题的方式:ISO8601

SQLite - 添加连接

于 2012-07-27T16:36:27.513 回答
4

你有没有SQLiteDataAdapter像这样尝试过..

SQLiteDataAdapter da = new SQLiteDataAdapter(dbCommand);
da.Fill(dt);

它的行为可能相同,但尝试并没有什么坏处;)

于 2012-07-26T19:57:42.133 回答
0

请参阅存储日期时间标题下有关 SQLite 和日期时间存储的此出版物

于 2012-04-23T20:50:15.190 回答