SQLite ExecuteReader - > DataTable.Load - > FormatException(DateTime)

时间:2012-04-23 20:07:00

标签: c# .net sql sqlite

我试图读出一个示例Northwind sqlite数据库,但在一些带有日期时间的表上出错。这是数据库还是System.Data.SQLite的问题? Exception有点像:“字符串不是有效的DateTime”

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

对于cource,我可以通过正确转换日期时间自己读出数据,但这并不像通过简单的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
  

“bei System.DateTimeParse.ParseExactMultiple(String s,String []   格式,DateTimeFormatInfo dtfi,DateTimeStyles样式)\ r \ n bei   System.DateTime.ParseExact(String s,String []格式,IFormatProvider   提供者,DateTimeStyles风格)\ r \ n bei   System.Data.SQLite.SQLiteConvert.ToDateTime(String dateText,   SQLiteDateFormats格式,DateTimeKind类)   C:\ dev的\源码\ DOTNET \ System.Data.SQLite \ SQLiteConvert.cs:Zeile   322“。

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

3 个答案:

答案 0 :(得分: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

<强> SOLUTION:

只需使用日期时间函数将字段转换为有效的.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 - Add Connection

答案 1 :(得分:3)

您是否尝试过使用SQLiteDataAdapter ..

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

它的行为可能相同但尝试不会造成伤害;)

答案 2 :(得分:0)

See this publication关于SQLite和DateTime存储,标题为存储日期时间