繁体   English   中英

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

[英]SQLite ExecuteReader --> DataTable.Load --> FormatException (DateTime)

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

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

对于cource,我可以通过正确转换datetime来自己读出数据,但这并不像通过简单的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 [] formats,DateTimeFormatInfo dtfi,DateTimeStyles style)\\ r \\ n bei System.DateTime.ParseExact(String s,String [] formats,IFormatProvider provider,DateTimeStyles style)\\ r \\ n bei System.Data.SQLite.SQLiteConvert.ToDateTime(String dateText,SQLiteDateFormats format,DateTimeKind kind),位于c:\\ dev \\ sqlite \\ dotnet \\ System.Data.SQLite \\ SQLiteConvert.cs:Zeile 322.“

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

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

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

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

解:

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

您是否尝试使用SQLiteDataAdapter

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

有可能它的行为相同,但尝试没有伤害;)

有关SQLite和DateTime存储的信息, 请参阅此出版物 ,该文章位于存储日期时间的标题下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM