SQLite SELECT查询中的自定义字段填充后不会成为DataTable中的DateTime列?
Posted
技术标签:
【中文标题】SQLite SELECT查询中的自定义字段填充后不会成为DataTable中的DateTime列?【英文标题】:Custom field in SQLite SELECT query doesn't become DateTime column in DataTable after filling it? 【发布时间】:2013-06-25 23:47:09 【问题描述】:题名不清楚,但是这个问题用我下面的描述就很清楚了:
我在 CREATE TABLE 查询中有一个声明为 datetime 的字段,如果我有以下查询并像这样填写 DataTable,我将此字段称为 BirthDay
:
SQLiteDataAdapter da = new SQLiteDataAdapter("SELECT BirthDay FROM myTable", myConnection);
DataTable dt = new DataTable();
da.Fill(dt);
myDataGridView.DataSource = dt;
myDataGridView
的列BirthDay
的类型为DateTime
,我可以通过myDataGridView.Columns["BirthDay"].ValueType
进行检查。
但是,如果我像这样更改 SELECT 查询:
SQLiteDataAdapter da = new SQLiteDataAdapter("SELECT CASE WHEN 1 THEN BirthDay END AS BirthDay2 FROM myTable", myConnection);
在填写我的 DataTable 并绑定到 myDataGridView 后,我预计 BirthDay2
列也是 DateTime
的类型。但是类型是System.Object
?
我尝试过使用CAST(... as DATETIME)
,但返回的类型是System.Int64
(我知道SQLite 中的DATETIME 实际上对应于.NET 中的Int64
),我想知道如何让它返回System.DateTime
原专栏BirthDay
。
我需要最终类型(可以通过DataGridViewColumn.ValueType
进行检查)是DateTime
,这样我就可以使用DataGridViewColumn.Format
来格式化我想要的日期时间字符串。
非常感谢您的帮助!
【问题讨论】:
我的查询只是为了说明目的,我想说我的BirthDay2
是对我的BirthDay
的某种引用,但BirthDay
使最终类型DateTime
而BirthDay2
使它System.Object
【参考方案1】:
我们的工作团队长期以来一直在研究这个问题。我们的最终结论是,任何包装源字段的表达式都会使源数据类型不可用。对于 ADO.NET 提供程序,使用表达式导致 System.Object
最终类型,对于 ODBC 提供程序,它导致 System.String
类型。所以它完全取决于你使用的数据提供者。为什么它会以这种方式运行是数据提供者开发人员的一个问题(我还没有找到答案)。
顺便说一句,.NET Framework 提供了多种工具来测试给定值是否为预期类型。 SQLite 3 中只有 5 种基本数据类型(NULL、INTEGER、REAL、TEXT、BLOB)。因此,在 .NET 代码中,您可以通过 3 种最常见类型(INTEGER、REAL、TEXT)的测试来传递您的值。
【讨论】:
以上是关于SQLite SELECT查询中的自定义字段填充后不会成为DataTable中的DateTime列?的主要内容,如果未能解决你的问题,请参考以下文章