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 使最终类型DateTimeBirthDay2 使它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列?的主要内容,如果未能解决你的问题,请参考以下文章

Select2 - 选项项中的自定义输入字段,防止点击事件

java实现多表的自定义查询。

从popover返回后如何在collectionview单元格中填充文本字段

如何用sqlite数据库通过id查询某一行的信息

Access 中的自定义函数返回类型转换错误

php 通过acf选择字段查询类别中的自定义帖子类型