SQLite SELECT查询中的自定义字段在填充后不会成为DataTable中的DateTime列吗?

时间:2013-06-28 08:45:42

标签: c# sql sqlite date datetime

问题标题不清楚,但是我的以下描述非常清楚这个问题:

我在CREATE TABLE查询中将一个字段声明为datetime,我调用此字段BirthDay,如果我有以下查询并填写如下的DataTable:

SQLiteDataAdapter da = new SQLiteDataAdapter("SELECT BirthDay FROM myTable", myConnection);
DataTable dt = new DataTable();
da.Fill(dt);
myDataGridView.DataSource = dt;

BirthDay的{​​{1}}列的类型为myDataGridView,我可以通过DateTime进行检查。

但是,如果我更改SELECT查询有点像这样:

myDataGridView.Columns["BirthDay"].ValueType

在填写我的DataTable并绑定到myDataGridView之后,我预计SQLiteDataAdapter da = new SQLiteDataAdapter("SELECT CASE WHEN 1 THEN BirthDay END AS BirthDay2 FROM myTable", myConnection); 列也是BirthDay2的类型。但是类型是DateTime

我尝试使用System.Object,但返回的类型是CAST(... as DATETIME)(我知道SQLite中的DATETIME实际上对应于.NET中的System.Int64),我想知道我是如何制作的它会将Int64作为原始列System.DateTime返回。

我需要最终类型(可通过BirthDay检查)DataGridViewColumn.ValueType,以便我可以使用DateTime格式化我的日期时间字符串。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我们的工作团队长期以来一直在研究这个问题。我们的最终结论是,任何表达式包装源字段都会使源数据类型不可用。对于使用表达式的ADO.NET提供程序,导致System.Object最终类型,对于ODBC提供程序,它会导致System.String类型。所以它完全取决于您使用的数据提供者。为什么它以这种方式运行是数据提供者开发人员的问题(我还没有找到答案)。 顺便说一句,.NET Framework提供了各种工具来测试给定值是否为预期类型。 SQLite 3中只有5种基本数据类型(NULL,INTEGER,REAL,TEXT,BLOB)。因此,在.NET代码中,您可以通过测试将值传递给3种最常见的类型(INTEGER,REAL,TEXT)。